L'area di validità (scope) di una variabile è la parte di codice all'interno della quale è possibile accedere alla variabile mediante un riferimento lessicale. Una variabile globale è definita in tutte le aree del codice, mentre una variabile locale è definita in una sola parte. In ActionScript 3.0, alle variabili viene sempre assegnata l'area di validità della funzione o della classe nella quale sono dichiarate. Una variabile globale è una variabile definita all'esterno di qualunque funzione o definizione di classe. Ad esempio, il codice seguente crea una variabile globale strGlobal dichiarandola all'esterno di qualunque funzione. L'esempio mostra che una variabile globale è disponibile sia all'interno che all'esterno della definizione di funzione.
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
Una variabile locale viene dichiarata all'interno di una definizione di funzione. L'area di codice più piccola per la quale è possibile definire una variabile locale è una definizione di funzione. Una variabile locale dichiarata all'interno di una funzione esiste solo in tale funzione. Se, ad esempio, dichiarate una variabile denominata str2 all'interno di una funzione denominata localScope(), tale variabile non è disponibile all'esterno della funzione.
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
Se la variabile locale è già stata dichiarata con lo stesso nome come variabile globale, la definizione locale ha la precedenza sulla definizione globale all'interno dell'area di validità della variabile locale. La variabile globale rimane valida all'esterno della funzione. Il codice seguente, ad esempio, crea una variabile globale di tipo String denominata str1, quindi crea una variabile locale con lo stesso nome all'interno della funzione scopeTest(). L'istruzione trace all'interno della funzione genera il valore locale della variabile, ma all'esterno della funzione genera il valore globale della variabile.
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
La variabili ActionScript, a differenza delle variabili C++ e Java, non possono avere un'area di validità a livello di blocco. Un blocco di codice è qualunque gruppo di istruzioni compreso tra una parentesi graffa di apertura ( { ) e una di chiusura (}). In alcuni linguaggi di programmazione, come C++ e Java, le variabili dichiarate in un blocco di codice non sono disponibili all'esterno del blocco. Questa restrizione viene definita “area di validità a livello di blocco” e non esiste in ActionScript. Una variabile dichiarata all'interno di un blocco di codice è disponibile non solo in tale blocco ma anche nelle altre parti della funzione alla quale esso appartiene. Ad esempio, la funzione seguente contiene variabili definite in vari blocchi di codice, ciascuna delle quali è disponibile nell'intera funzione.
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"]);
Un'implicazione interessante dell'assenza dell'area di validità a livello di blocco è la possibilità di leggere o scrivere una variabile prima che venga dichiarata, a condizione che la dichiarazione sia inclusa prima della fine della funzione. Ciò è possibile grazie a una tecnica chiamata hoisting, in base alla quale il compilatore sposta tutte le dichiarazioni di variabili all'inizio della funzione. Ad esempio, il codice seguente viene compilato correttamente anche se la funzione iniziale trace() della variabile num ha luogo prima che tale variabile sia dichiarata:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
Il compilatore tuttavia non esegue l'hoisting per le istruzioni di assegnazione, motivo per cui l'istruzione iniziale trace() di num produce NaN (not a number), che è il valore predefinito per le variabili del tipo di dati Number. Pertanto, è possibile assegnare valori alle variabili anche prima che siano dichiarate, come nell'esempio seguente:
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10