Técnico

Escopo de Váriavel em ActionScript 3

Você sabe o que acontece no código abaixo?

var teste:Boolean = false;
if(teste)
{
var nome:String;
}
else
{
nome = "Bruno Sales";
}
trace("Nome: " + nome);

Erro de compilação? Erro de execução? Nenhum dos dois. O resultado do trace é “Nome: Bruno Sales”. A variável foi criada mesmo que o código dentro do IF não tivesse sido executado.
Isso acontece pois o ActionScript só tem 2 tipos de escopo: Global e Local; onde Local é considerado todo o escopo dentro de uma função.

Contudo, sugiro para que nunca utilizem algo deste tipo em seu processo de desenvolvimento. A lógica de seu código ficará muito confusa e causará sérios problemas para manutenção e debug.

5 Comments

  • Mario Junior disse:

    O erro mais comum q eu vejo da gurizada é o de usar dois “fors” na mesma função, usando o contador como variavel “i” para ambos os “fors”. No primeiro for, blz, funciona, já no segundo dá erro pq o valor do primeiro ainda influencia.

  • Beck Novaes disse:

    Isso tem a ver com o tempo de vinculação de memória definido pelo compilador. Alguns tipos de variáveis são vinculadas no momento da compilação (geralmente as constantes), outros no carregamento do programa e outros em tempo de execução. Deste exemplo é possível deduzir que no caso do compilador do Flex, para este tipo de variável, isso é feito no momento do carregamento do programa, por isso no if é irrelevante. Isso tudo tem a ver com compiladores e pode variar de uma tecnologia para outra dependendo como o compilador foi implementado. Falha da Adobe, provavelmente não, mas sim uma decisão de projeto. É provável que este tipo de alocação seja mais fácil de implementar e, por ter várias outras coisas para se preocupar, optaram por esta solução.

  • Jan disse:

    Pois é… isso nem é novidade mas foi bom levantar essa questão.
    Apesar do if ser um bloco de execução, ele não tem escopo, não importa quantos vc fizer, o nivel é unico para o metodo, o que muda é a decisão tomada. Lógica de prog básica.

    Sendo assim, se vc declara qualquer coisa dentro de um bloco, seja dentro de if, switch ou qualquer controlador ou loop, essa declaração que vc fez, será alocada na memória SEMPRE.

    Prova dos 9, roda em debug e da um break na linha onde vc iguala nome, vc vai ver que a var “nome” já existe e ta prontinha p/ ser usada.

    A boa prática que recomendo é “declare tudo antes”, assim com já é feito quando se declara props no escopo da classe, declare as locais de function no começo, pq vc já ve no “header” do método o que ele usa p/ processar suas instruções. Logo depois é legal atribuir, isso ajuda muito na leitura.

    Eu costumo até mesmo p/ iterators, declarar antes:

    function makeItBetter():void
    {
    var i:int;
    var p:String;

    i = 0;

    for(; i<100; i++);
    for(p in {});
    }

    Ta ai a dica 😉

  • Mário, com o uso vários for, me parece que fica até melhor utilizar a mesma variável para todos (desde que os for não sejam aninhados e a variável seja zerada em cada for) – assim, apenas uma variável seria alcoada em memória e poderia ser reutilizada.

  • I have learn several excellent stuff here. Certainly price bookmarking for revisiting. I wonder how a lot effort you put to make any such magnificent informative website.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Compartilhe isso: