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 existe 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 fica 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 existe 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 um colchete de abertura ({ ) e um 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 fica 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