Variáveis



As variáveis permitem armazenar valores usados no programa. Para declarar uma variável, você deve usar a instrução var com o nome da variável. No ActionScript 2.0, o uso da instrução var só é necessário se você usar anotações de tipo. No ActionScript 3.0, o uso da instrução var é sempre necessário. Por exemplo, a seguinte linha do ActionScript declara uma variável chamada i:

var i;

Se omitir a instrução var ao declarar uma variável, você obterá um erro de compilador no modo estrito e um erro de tempo de execução no modo padrão. Por exemplo, a seguinte linha de código resultará em um erro se a variável i não for definida antes:

i; // error if i was not previously defined

A associação de uma variável a um tipo de dados deve ser feita durante a declaração da variável. A declaração de uma variável sem designar seu tipo é legal, mas gera um aviso do compilador no modo estrito. Um tipo de variável é designado anexando o nome da variável ao caractere dois-pontos (:) seguido do tipo da variável. Por exemplo, o seguinte código declara uma variável i que é do tipo int:

var i:int;

Você atribui um valor à variável usando o operador de atribuição (=). Por exemplo, o seguinte código declara uma variável i e lhe atribui o valor 20:

var i:int; 
i = 20;

Pode ser mais conveniente atribuir um valor a uma variável ao mesmo que em que ela é declarada, como no exemplo a seguir:

var i:int = 20;

A técnica de atribuir um valor a uma variável no momento em que ela é declarada é comumente usado não apenas para atribuir valores primitivos, como inteiros e seqüências de caracteres, mas também para criar uma matriz ou instanciação de uma ocorrência de uma classe. O exemplo a seguir mostra a declaração e a atribuição de um valor a uma matriz usando uma única linha de código:

var numArray:Array = ["zero", "one", "two"];

É possível criar uma ocorrência de uma classe usando o operador new. O exemplo a seguir cria uma ocorrência de uma classe chamada CustomClass e atribui uma referência para a ocorrência de classe recém-criada à variável chamada customItem:

var customItem:CustomClass = new CustomClass();

Se tiver mais de uma variável a declarar, você poderá declará-las em uma única linha de código usando o operador vírgula (,) para separar as variáveis. Por exemplo, o seguinte código declara três variáveis em uma única linha de código:

var a:int, b:int, c:int;

Você também pode atribuir valores a cada variável na mesma linha de código. Por exemplo, o seguinte código declara três variáveis (a, b e c), e atribui um valor a cada uma:

var a:int = 10, b:int = 20, c:int = 30;

Embora você possa usar o operador vírgula para agrupar declarações de variáveis em uma instrução, isso pode reduzir a legibilidade do código.

Noções básicas sobre o escopo de variáveis

O escopo de uma variável é a área do código em que a variável pode ser acessada por uma referência léxica. Uma variável global é aquela definida em todas as áreas do seu código, enquanto que uma variável local é aquela definida apenas em uma parte dele. No ActionScript 3.0, às variáveis é sempre atribuído o escopo da função ou classe em que elas são declaradas. Uma variável global é aquela especificada fora de qualquer definição de função ou classe. Por exemplo, o seguinte código cria uma variável global i declarando-a fora de qualquer função: O exemplo mostra que uma variável global está disponível tanto dentro quanto fora da definição da função.

var strGlobal:String = "Global"; 
function scopeTest() 
{ 
    trace(strGlobal); // Global 
} 
scopeTest(); 
trace(strGlobal); // Global

A variável local é declarada dentro de uma definição de função. A menor área de código para a qual é possível definir uma variável local é uma definição de função. Uma variável local declarada dentro de uma função existirá somente nessa função. Por exemplo, se você declarar uma variável chamada str2 dentro de uma função chamada localScope(), essa variável não ficará disponível fora da função.

function localScope() 
{ 
    var strLocal:String = "local"; 
} 
localScope(); 
trace(strLocal); // error because strLocal is not defined globally

Se o nome de variável usado para a variável local já estiver declarado como uma variável global, a definição local ocultará (ou obscurecerá) a definição global enquanto a variável local estiver no escopo. A variável global ainda existirá fora da função. Por exemplo, o código a seguir cria uma variável de seqüência de caracteres global chamada str1 e uma variável local de mesmo nome dentro da função scopeTest(). A instrução trace dentro da função gera o valor local da variável, mas a instrução trace fora da função gera o valor global da variável.

var str1:String = "Global"; 
function scopeTest () 
{ 
    var str1:String = "Local"; 
    trace(str1); // Local 
} 
scopeTest(); 
trace(str1); // Global

As variáveis do ActionScript, diferentemente de C++ e Java, não possuem escopo em nível de bloqueio. Um código de bloqueio é qualquer grupo de instruções entre uma chave de abertura ( { ) e uma de fechamento ( } ). Em algumas linguagens de programação, como C++ e Java, as variáveis declaradas dentro de um bloco de código não ficam disponíveis fora dele. Essa restrição de escopo é chamada de escopo em nível de bloqueio e não existe no ActionScript. Se você declarar uma variável dentro de um bloco de código, ela ficará disponível não apenas nesse bloco, mas também em outras partes da função à qual o bloco pertence. Por exemplo, a seguinte função contém variáveis que são definidas em vários escopos de bloco. Todas as variáveis estão disponíveis na função.

function blockTest (testArray:Array) 
{ 
    var numElements:int = testArray.length; 
    if (numElements > 0) 
    { 
        var elemStr:String = "Element #"; 
        for (var i:int = 0; i < numElements; i++) 
        { 
            var valueStr:String = i + ": " + testArray[i]; 
            trace(elemStr + valueStr); 
        } 
        trace(elemStr, valueStr, i); // all still defined 
    } 
    trace(elemStr, valueStr, i); // all defined if numElements > 0 
} 
 
blockTest(["Earth", "Moon", "Sun"]);

Uma implicação interessante da falta de escopo em nível de bloco é que você pode ler ou gravar em uma variável antes que ela seja declarada, contanto que ela seja declarada antes que a função termine. Isso é possível por causa de uma técnica chamada içamento, que significa que o compilador move todas as declarações de variável para o início da função. Por exemplo, o código a seguir é compilado muito embora a função inicial trace() para a variável num ocorra antes que a variável num seja declarada:

trace(num); // NaN 
var num:Number = 10; 
trace(num); // 10

O compilador, porém, não içará nenhuma instrução de atribuição. Isso explica por que o trace() inicial de num resulta em NaN (e não um número), que é o valor padrão para as variáveis do tipo de dados Number. Isso significa que você pode atribuir valores a variáveis mesmo antes que elas sejam declaradas, como mostra o seguinte exemplo:

num = 5; 
trace(num); // 5 
var num:Number = 10; 
trace(num); // 10

Valores padrão

Um valor padrão é o valor que uma variável contém antes que seu valor seja definido. Uma variável é inicializada quando seu valor é definido pela primeira vez. Se você declarar uma variável, mas não definir seu valor, ela será uma variável não inicializada. O valor de uma variável não inicializada depende de seu tipo de dados. A tabela a seguir descreve os valores padrão de variáveis, organizados por tipo de dados:

Tipo de dados

Valor padrão

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

Não declarado (equivalente à anotação de tipo *)

undefined

Todas as outras classes, inclusive classes definidas pelo usuário.

null

Para variáveis do tipo Number, o valor padrão é NaN (e não um número), que é um valor especial definido pelo padrão IEEE-754 para indicar um valor que não representa um número.

Se você declarar uma variável, mas não seu tipo de dados, o tipo de dados padrão * será aplicado, o que significa que, na verdade, a variável é sem tipo. Se você também não inicializar uma variável sem tipo com um valor, seu valor padrão será undefined.

Para tipos de dados que não forem Boolean, Number, int e uint, o valor padrão de qualquer variável não inicializada será null. Isso se aplica a todas as classes definidas pelo ActionScript 3.0, bem como a quaisquer classes personalizadas que você criar.

O valor null não é um valor válido para variáveis do tipo Boolean, Number, int ou uint. Se você tentar atribuir um valor null a esse tipo de variável, o valor será convertido no valor padrão para esse tipo de dados. Para variáveis do tipo Object, é possível atribuir um valor null. Se você tentar atribuir um valor undefined a uma variável do tipo Object, o valor será convertido em null.

Para variáveis do tipo Number, existe uma função especial de nível superior chamada isNaN() que retorna o valor booleano true se a variável não for um número e false se for.