Zmienne

Zmienne umożliwiają przechowywanie wartości używanych w programie. W celu zadeklarowania zmiennej należy użyć instrukcji var z nazwą zmiennej. W języku ActionScript 3.0 instrukcja var zawsze jest wymagana. Na przykład w poniższym wierszu kodu ActionScript deklarowana jest zmienna o nazwie i :

var i;

W wypadku pominięcia instrukcji var w deklaracji zmiennej zgłoszony zostanie błąd (błąd kompilatora w trybie ścisłym i błąd czasu wykonania w trybie standardowym). Poniższy wiersz kodu spowoduje błąd, jeśli zmienna i nie została wcześniej zadeklarowana:

i; // error if i was not previously defined

Aby skojarzyć zmienną z typem danych, należy wskazać ten typ w deklaracji zmiennej. Deklarowanie zmiennej bez wskazania typu jest formalnie dozwolone, ale powoduje wygenerowanie przez kompilator ostrzeżenia w trybie ścisłym. Typ zmiennej wskazuje się, dodając do nazwy zmiennej dwukropek (:) i nazwę typu. Na przykład poniższy kod deklaruje zmienną i typu int:

var i:int;

Zmiennej można przypisać wartość, używając operatora przypisania ( = ). Na przykład poniższy kod deklaruje zmienną i , a następnie przypisuje jej wartość 20:

var i:int; 
i = 20;

Niekiedy wygodniejszym rozwiązaniem jest przypisanie zmiennej wartości w momencie jej deklarowania, co ilustruje poniższy przykład:

var i:int = 20;

Technika przypisywania zmiennym wartości już w momencie deklarowania jest powszechnie stosowana nie tylko do przypisywania wartości pierwotnych, jak liczby całkowite i ciągi znaków, lecz także przy tworzeniu tablic oraz instancji klas. Poniższy przykład ilustruje deklarację tablicy i przypisanie jej wartości w jednym wierszu kodu.

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

Instancję klasy można utworzyć, korzystając z operatora new . W poniższym przykładzie tworzona jest instancja klasy CustomClass , po czym odwołanie do nowo utworzonej instancji przypisywane jest zmiennej o nazwie customItem :

var customItem:CustomClass = new CustomClass();

Jeśli mamy do zadeklarowania więcej niż jedną zmienną, możemy zadeklarować je wszystkie w jednym wierszu kodu, oddzielając je operatorem przecinka , ). Na przykład w poniższym kodzie w jednym wierszu deklarowane są trzy zmienne:

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

W tym samym wierszu kodu można przypisać wartości wszystkim zmiennym. Na przykład w poniższym kodzie deklarowane są trzy zmienne ( a , b, oraz c ) i każdej z nich przypisywana jest wartość:

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

Mimo że dozwolone jest użycie przecinka do grupowania deklaracji zmiennych w jednej instrukcji, może to pogorszyć czytelność kodu.

Zasięg zmiennych — omówienie

Zasięg zmiennej jest to obszar kodu, w którym do zmiennej można odwoływać się leksykalnie. Zmienna globalna to zmienna zdefiniowana we wszystkich obszarach kodu, natomiast zmienna lokalna to zmienna zdefiniowana tylko w jednej części kodu. W języku ActionScript 3.0 zmienne mają zawsze przypisany zasięg funkcji lub klasy, w której zostały zadeklarowane. Zmienna globalna to zmienna zdefiniowana poza definicją jakiejkolwiek funkcji lub klasy. Na przykład poniższy kod tworzy zmienną globalną strGlobal , ponieważ jest ona zadeklarowana poza jakąkolwiek funkcją. Przykład ilustruje fakt, że zmienna globalna jest dostępna zarówno wewnątrz definicji funkcji, jak i poza tą definicją.

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

Zmienną lokalną deklaruje się wewnątrz definicji funkcji. Najmniejszym obszarem kodu, w jakim można zadeklarować zmienną lokalną, jest definicja funkcji. Zmienna lokalna zadeklarowana wewnątrz funkcji istnieje tylko w tej funkcji. Na przykład, jeśli zadeklarujemy zmienną o nazwie str2 w funkcji o nazwie localScope() , zmienna ta nie będzie dostępna na zewnątrz funkcji.

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

Jeśli nazwa zmiennej lokalnej jest taka sama jak nazwa zadeklarowanej zmiennej globalnej, to w zasięgu zmiennej lokalnej deklaracja lokalna ukryje (przesłoni) definicję globalną. Zmienna globalna istnieje nadal na zewnątrz funkcji. Na przykład poniższy kod tworzy zmienną globalną typu string o nazwie str1 , a następnie tworzy zmienną lokalną o tej samej nazwie wewnątrz funkcji scopeTest() . Instrukcja trace wewnątrz funkcji wyświetla lokalną wartość zmiennej, ale instrukcja trace poza funkcją wyświetla wartość zmiennej globalnej.

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

W języku ActionScript, inaczej niż w języku C++ i Java, zmienne nie mają zasięgu na poziomie bloku. Blok kodu jest to dowolna grupa instrukcji między otwierającym nawiasem sześciennym ( { ) a zamykającym nawiasem sześciennym ( } ). W niektórych językach programowania, takich jak C++ i Java, zmienne zadeklarowane wewnątrz bloku kodu nie są dostępne poza tym blokiem. To ograniczenie zasięgu nie istnieje w języku ActionScript. Zmienna zadeklarowana wewnątrz bloku kodu jest dostępna nie tylko w tym bloku, lecz także we wszystkich innych częściach funkcji, do której należy ten blok kodu. Na przykład poniższa funkcja zawiera zmienne zdefiniowane w różnych blokach. Wszystkie te zmienne są dostępne w całej funkcji.

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"]);

Interesującą implikacją braku zasięgu na poziomie bloków jest możliwość odczytywania i przypisywania wartości zmiennej zanim zostanie ona zadeklarowana, pod warunkiem że deklaracja zmiennej znajduje się gdziekolwiek przed końcem funkcji. Wynika to z zastosowania w kompilatorze techniki niejawnego przenoszenia deklaracji na początek funkcji (ang. hoisting ). Na przykład poniższy kod jest formalnie poprawny mimo że pierwsze wywołanie funkcji trace() ze zmienną num znajduje się przed deklaracją zmiennej num :

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

Przenoszenie deklaracji na początek funkcji nie jest jednak równoznaczne z analogicznym przenoszeniem instrukcji przypisania. Wyjaśnia to, dlaczego pierwsze wywołanie trace() dla zmiennej num zwraca wartość NaN (nie liczba), czyli domyślną wartość zmiennych typu Number. A zatem możliwe jest przypisywanie zmiennym wartości zanim zmienne te zostaną zadeklarowane, co ilustruje poniższy przykład:

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

Wartości domyślne

Wartość domyślna jest to wartość przechowywana w zmiennej zanim kod użytkownika przypisze jej inną wartość. Pierwsze przypisanie wartości zmiennej nazywamy inicjowaniem zmiennej. Jeśli zmienna została zadeklarowana, ale nie przypisano jej wartości, to zmienna jest niezainicjowana . Wartość zmiennej niezainicjowanej zależy od jej typu danych. W poniższej tabeli opisano domyślne wartości zmiennych dla poszczególnych typów danych:

Typ danych

Wartość domyślna

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

Niezadeklarowany (równoważny wskazaniu typu * )

undefined

Wszystkie pozostałe klasy, w tym klasy zdefiniowane przez użytkownika.

null

W przypadku zmiennych typu Number wartością domyślną jest NaN (ang. not a number — nie liczba), czyli specjalna wartość określona w standardzie IEEE-754 jako niereprezentująca liczby.

W wypadku zadeklarowania zmiennej, ale niewskazania jej typu danych, zmienna otrzyma domyślny typ danych * , co zazwyczaj oznacza, że będzie zmienną bez typu. Jeśli zmienna bez typu nie zostanie zainicjowana wartością, będzie miała domyślną wartość undefined .

W przypadku typów danych innych niż Boolean, Number, int oraz uint wszystkie niezainicjowane zmienne mają wartość null . Dotyczy to wszystkich klas zdefiniowanych w języku ActionScript 3.0 oraz wszelkich niestandardowych klas utworzonych przez użytkownika.

Wartość null nie jest poprawną wartością zmiennych typu Boolean, Number, int, lub uint. Próba przypisania wartości null takiej zmiennej spowoduje przekonwertowanie wartości na wartość domyślną odpowiedniego typu danych. Zmiennym typu Object można przypisywać wartość null . Próba przypisania wartości undefined zmiennej typu Object spowoduje przekonwertowanie wartości na null .

W przypadku zmiennych typu Number dostępna jest specjalna funkcja globalna isNaN() , która zwraca wartość logiczną true , jeśli zmienna nie jest liczbą, albo false w przeciwnym razie.