變數的「範圍」是語彙參考可以在其中存取變數的程式碼區域。「全域」變數是定義於程式碼所有區域中的一種變數,而「區域」變數則是僅定義於程式碼一部分的一種變數。在 ActionScript 3.0 中,指定給變數的範圍僅限於在其中宣告這些變數的函數或類別。全域變數是您在任何函數或類別定義之外定義的變數。例如,下列程式碼會在任何函數之外宣告,建立全域變數 strGlobal。這個範例顯示,全域變數可以同時在函數定義之內和之外使用。
var strGlobal:String = "Global";
function scopeTest()
{
trace(strGlobal); // Global
}
scopeTest();
trace(strGlobal); // Global
您可以在函數定義之內宣告變數,藉以宣告區域變數。可供您定義區域變數的最小程式碼區域是函數定義。在函數之內宣告的區域變數,只存在於該函數之中。例如,如果您在名為 localScope() 的函數中宣告名為 str2 的變數,該變數無法在此函數之外使用。
function localScope()
{
var strLocal:String = "local";
}
localScope();
trace(strLocal); // error because strLocal is not defined globally
如果您用於區域變數的變數名稱已宣告為全域變數,當區域變數位於範圍內時,區域定義會隱藏 (或遮蔽) 全域定義。全域變數仍會存在於函數之外。例如,下列程式碼會建立名為 str1 的全域字串變數,然後在 scopeTest() 函數內建立相同名稱的區域變數。函數之內的 trace 陳述式會輸出該變數的區域值,但函數之外的 trace 陳述式則會輸出該變數的全域值。
var str1:String = "Global";
function scopeTest ()
{
var str1:String = "Local";
trace(str1); // Local
}
scopeTest();
trace(str1); // Global
ActionScript 變數與 C++ 和 Java 中的變數不同,不會有區塊層級範圍。程式碼區塊是介於左大括號 ({) 與右大括號 (}) 之間的任何一組陳述式。在像是 C++ 和 Java 這類程式語言中,於程式碼區塊之內宣告的變數無法在該程式碼區塊之外使用。這項範圍限制稱為區塊層級範圍,但在 ActionScript 中並沒有這項限制。如果在程式碼區塊之內宣告變數,則該變數不僅可在該程式碼區塊中使用,也可以在程式碼所屬函數的任何其它部分使用。例如,下列函數包含在各種不同區塊範圍中定義的變數。所有變數都可以透過函數使用。
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"]);
沒有區塊層級範圍代表一項有趣的含意:您可以在宣告變數之前讀取或寫入,只要在函數結束前宣告即可。這是因為有一個稱為「升舉」的技術,會讓編譯器將所有變數宣告移至函數的最上層。例如,下列程式碼即使在 num 變數的初始 trace() 函數於宣告 num 變數之前發生,也會進行編譯:
trace(num); // NaN
var num:Number = 10;
trace(num); // 10
但是,編譯器並不會升舉任何指定陳述式。這說明了 num 之初始 trace() 產生 NaN (非數字) 的原因,此為 Number 資料類型的變數預設值。這表示即使在宣告變數之前,您也可以指定變數的值,如下列範例所示:
num = 5;
trace(num); // 5
var num:Number = 10;
trace(num); // 10