Variabili

Le variabili consentono di memorizzare valori da utilizzare in un programma. Per dichiarare una variabile, è necessario utilizzare l'istruzione var nel suo nome, mentre è obbligatorio in tutti i casi in ActionScript 3.0. Ad esempio, la seguente riga di codice ActionScript dichiara una variabile denominata i:

var i;

Se omettete l'istruzione var quando dichiarate una variabile, viene generato un errore del compilatore in modalità rigorosa e un errore runtime in modalità standard. Ad esempio, la seguente riga di codice genera un errore se la variabile i non è stata definita in precedenza:

i; // error if i was not previously defined

L'associazione di una variabile a un tipo di dati deve essere effettuata al momento di dichiarare la variabile. La dichiarazione di una variabile senza indicazione del tipo è consentita ma genera un'avvertenza del compilatore in modalità rigorosa. Per designare il tipo di una variabile, aggiungete al nome un carattere di due punti (:) seguito dal tipo. Ad esempio, il codice seguente dichiara una variabile denominata i del tipo int:

var i:int;

Potete assegnare un valore a una variabile utilizzando l'operatore di assegnazione (=). Ad esempio, il codice seguente dichiara la variabile i e vi assegna il valore 20:

var i:int; 
i = 20;

Può risultare più pratico assegnare un valore a una variabile nel momento in cui viene dichiarata, come nell'esempio seguente:

var i:int = 20;

Questa tecnica viene comunemente utilizzata non solo quando si assegnano valori di base come numeri interi e stringhe, ma anche quando si un crea un array o un'istanza di una classe. L'esempio seguente mostra un array che viene dichiarato e al quale viene assegnato un valore nella stessa riga di codice.

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

Potete creare un'istanza di una classe utilizzando l'operatore new. L'esempio seguente crea un'istanza della classe CustomClass e assegna alla variabile customItem un riferimento alla nuova istanza creata:

var customItem:CustomClass = new CustomClass();

Potete dichiarare più variabili nella stessa riga di codice utilizzando l'operatore virgola (,) per separarle. Ad esempio, il codice seguente dichiara tre variabili nella stessa riga:

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

È anche possibile assegnare valori a ciascuna delle variabili nella stessa riga di codice. Ad esempio, il codice seguente dichiara tre variabili (a, b e c) e assegna un valore a ciascuna:

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

L'uso dell'operatore virgola per raggruppare le dichiarazioni di variabili nella stessa istruzione può tuttavia ridurre la leggibilità del codice.

Area di validità delle variabili

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

Valori predefiniti

Per valore predefinito si intende il valore che una variabile contiene prima che ne venga impostato il valore. Una variabile viene inizializzata quando se ne imposta il valore per la prima volta. Se si dichiara una variabile ma non se ne imposta il valore, tale variabile rimane non inizializzata. Il valore di una variabile non inizializzata dipende dal suo tipo di dati. La tabella seguente descrive i valori predefiniti delle variabili, organizzati per tipo di dati:

Tipo di dati

Valore predefinito

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

Non dichiarato (equivalente all'annotazione di tipo *)

undefined

Tutte le altre classi, comprese quelle definite dall'utente.

null

Per le variabili di tipo Number, il valore predefinito è NaN (not a number), che è un valore speciale definito dallo standard IEEE-754 per indicare un valore che non rappresenta un numero.

Se dichiarate una variabile senza dichiararne il tipo di dati, viene applicato il tipo predefinito *, che indica che la variabile è priva di tipo. Inoltre, se una variabile senza tipo non viene inizializzata con un valore, il valore predefinito è undefined.

Per i tipi di dati diversi da Boolean, Number, int e uint, il valore predefinito di qualunque variabile non inizializzata è null, sia per le classi definite da ActionScript 3.0 che per quelle personalizzate definite dall'utente.

Il valore null non è valido per le variabili di tipo Boolean, Number, int o uint. Se tentate di assegnarlo a una di queste variabili, viene convertito nel valore predefinito per il tipo di dati corrispondente. È invece possibile assegnare il valore null alle variabili di tipo Object. Se tentate di assegnare il valore undefined a una variabile Object, il valore viene convertito in null.

Per le variabili di tipo Number esiste una funzione speciale di primo livello denominata isNaN(), che restituisce il valore booleano true se la variabile non è un numero oppure false in caso contrario.