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