Variabler

Med variabler kan du lagra värden som du använder i programmet. Om du vill deklarera en variabel måste du använda programsatsen var med variabelnamnet. I ActionScript 3.0, krävs alltid programsatsen var. I följande ActionScript-rad deklareras en variabel som heter i:

var i;

Om du utesluter programsatsen var när du deklarerar en variabel visas ett kompileringsfel i strikt läge och ett körningsfel i standardläge. Följande kodrad resulterar i ett fel om variabeln i inte har definierats tidigare:

i; // error if i was not previously defined

Om du vill koppla en variabel till en datatyp måste du göra det när du deklarerar variabeln. Du kan deklarera en variabel utan att ange variabelns typ, men det genererar en kompileringsvarning i strikt läge. Du anger en variabels typ genom att avsluta variabelnamnet med ett kolon (:) följt av variabelns typ. I följande kod deklareras variabeln i som är av typen int:

var i:int;

Du kan koppla ett värde till en variabel med tilldelningsoperatorn (=). I följande kod deklareras variabeln i och värdet 20 tilldelas variabeln:

var i:int; 
i = 20;

Du kanske tycker att det är enklare att tilldela en variabel ett värde samtidigt som du deklarerar variabeln, som i följande exempel:

var i:int = 20;

Tekniken med att tilldela en variabel ett värde samtidigt som variabeln deklareras är vanlig inte bara när man tilldelar primitiva värden som heltal och strängar, utan också när man skapar en array eller instansierar en instans av en klass. I följande exempel visas en array som deklarerats och tilldelats ett värde med en kodrad.

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

Du kan skapa en instans av en klass med operatorn new. I följande exempel skapas en instans av en namngiven CustomClass och en referens till den nyligen skapade klassinstansen kopplas till variabeln customItem:

var customItem:CustomClass = new CustomClass();

Om du har flera variabler som ska deklareras kan du deklarera alla på samma kodrad med hjälp av kommaoperatorn (,) som avgränsar variablerna. I följande kod deklareras tre variabler på samma kodrad:

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

Du kan också tilldela varje variabel värden på samma kodrad. I följande kod deklareras tre variabler (a, b och c) och varje variabel tilldelas ett värde:

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

Du kan använda kommaoperatorn för att gruppera variabeldeklarationer i samma programsats, men detta minskar kodens läsbarhet.

Variabelomfång

En variabels omfång är det område i koden där variabeln kan nås av en lexikalreferens. En global variabel har definierats i alla kodens områden, medan en lokal variabel bara har definierats i en viss del av koden. I ActionScript 3.0 tilldelas variabler alltid det omfång av den funktion eller den klass som de deklarerats i. En global variabel definierar du utanför en funktions- eller klassdefinition. I följande kod skapas till exempel den globala variabeln strGlobal eftersom den deklareras utanför en funktion. I exemplet visas att en global variabel är tillgänglig både inuti och utanför funktionsdefinitionen.

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

Du deklarerar en lokal variabel inuti en funktionsdefinition. Det minsta område i en kod för vilket du kan definiera en lokal variabel är en funktionsdefinition. En lokal variabel som deklareras inuti en funktion finns bara i den funktionen. Om du exempelvis deklarerar en variabel med namnet str2 i en funktion som heter localScope() är den variabeln inte tillgänglig utanför funktionen.

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

Om det variabelnamn du använder för den lokala variabeln redan har deklarerats som en global variabel, är det den lokala definitionen som döljer (eller skuggar) den globala definitionen när den lokala variabeln finns i omfånget. Utanför funktionen kommer den globala variabeln fortfarande att gälla. I följande kod skapas en global variabel med namnet str1 och därefter kommer en lokal variabel med samma namn att skapas i funktionen scopeTest(). Programsatsen trace inuti funktionen matar ut variabelns lokala värde, och programsatsen trace utanför funktionen matar ut variabelns globala värde.

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

ActionScript-variabler har inte blocknivåomfång, vilket variabler i C++ och Java har. Ett kodblock är en grupp programsatser mellan en inledande klammerparentes ( { ) och en avslutande klammerparentes (}). I vissa programmeringsspråk, till exempel C++ och Java, är variabler som deklarerats inuti ett kodblock inte tillgängliga utanför kodblocket. Denna begränsning av omfånget kallas blocknivåomfång och finns inte i ActionScript. Om du deklarerar en variabel inuti ett kodblock är denna variabel tillgänglig inte bara i det kodblocket, utan även i andra delar av funktionen som kodblocket hör till. Följande funktion innehåller variabler som definierats i olika blockomfång. Alla variablerna är tillgängliga i hela funktionen.

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

En intressant konsekvens av att det inte finns något blocknivåomfång är att du kan läsa eller skriva till en variabel innan den är deklarerad, förutsatt att den deklareras innan funktionen avslutas. Detta tack vare en teknik som kallas hoisting, som innebär att kompilatorn flyttar alla variabeldeklarationer till funktionens översta nivå. Följande kod kompileras till exempel även om den initiala funktionen trace() för variabeln num inträffar innan variabeln num har deklarerats:

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

Kompilatorn lyfter inte några tilldelningsprogramsatser. Detta förklarar varför den initiala funktionen trace() för num resulterar i NaN (not a number), vilket är standardvärdet för variabler för datatypen Number. Detta betyder att du kan tilldela variabler värden även innan de har deklarerats, vilket visas i följande exempel:

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

Standardvärden

Ett standardvärde är variabelns värde innan du anger ett värde för den. Du initierar en variabel när du bestämmer värdet första gången. Om du deklarerar en variabel, men inte bestämmer något värde, kommer variabeln att vara oinitierad. Värdet på en oinitierad variabel beror på variabelns datatyp. I följande tabell beskrivs standardvärden för variabler, ordnade efter datatyp:

Datatyp

Standardvärde

Boolean

false

int

0

Number

NaN

Object

null

String

null

uint

0

Ej deklarerad (motsvarar en typanteckning *)

undefined

Alla andra klasser, däribland användardefinierade klasser.

null

För variabler av typen Number är standardvärdet NaN (not a number) som är ett speciellt värde som definieras av IEEE-754-standarden och som betyder att det är ett värde som inte representerar ett tal.

Om du deklarerar en variabel, men inte deklarerar dess datatyp, används standarddatatypen *, vilket betyder att variabeln är typlös. Om du heller inte initierar en typlös variabel med ett värde, blir standardvärdet undefined.

För andra datatyper än Boolean, Number, int och uint är standardvärdet för alla oinitierade variabler null. Detta gäller alla klasser som har definierats av ActionScript 3.0, men även alla de klasser som du själv skapar.

Värdet null är inte ett giltigt värde för variabler av typen Boolean, Number, int och uint. Om du försöker tilldela en sådan variabel värdet null konverteras det till standardvärdet för den datatypen. Du kan däremot tilldela värdet null för variabler av typen Object. Om du försöker tilldela en variabel av typen Object värdet undefined, konverteras värdet till null.

För variabler av typen Number finns det en speciell funktion på översta nivån som heter isNaN() som returnerar det booleska värdet true om variabeln inte är ett tal och i annat fall false.