Flash CS3 文件 |
|||
| ActionScript 3.0 程式設計 > ActionScript 語言和語法 > 變數 | |||
變數可以讓您儲存在程式中使用的值。若要宣告變數,必須使用 var 陳述式加上變數名稱。在 ActionScript 2.0 中,只有在使用類型註釋時,才需要使用 var 陳述式;而在 ActionScript 3.0 中,則是一律必須使用 var 陳述式。例如,下列 ActionScript 程式碼行會宣告名為 i 的變數:
var i;
如果在宣告變數時省略 var 陳述式,則在嚴謹模式中將收到編譯器錯誤,而在標準模式中則將收到執行階段錯誤。例如,如果事前並未定義 i 變數時,下列程式碼就會產生錯誤:
i; // 事前未定義 i 時會產生錯誤
若要使變數與資料類型產生關聯時,您必須在宣告變數時就這麼做。在未指定變數的類型時宣告變數是合乎規定的作業,但在嚴謹模式中將產生編譯器警告。您可以在變數名稱後面加上冒號 (:) 接著加上資料類型,以指定變數的類型。例如,下列程式碼會宣告類型為 int 的變數 i:
var i:int;
您可以使用指定運算子 (=),將值指定給變數。例如,下列程式碼會宣告變數 i,並將此變數的值指定為 20:
var i:int; i = 20;
您可能會發現,在宣告變數時,同時也指定值會比較方便,如下列範例所示:
var i:int = 20;
在宣告變數時,同時也指定值的作法,不僅可運用於指定如整數或字串等基本值,也能運用於建立陣列或實體化類別實體。下列範例會示範使用一行程式碼,宣告陣列同時也指定其值。
var numArray:Array = ["zero", "one", "two"];
您可以使用 new 運算子,建立類別的實體。下列範例會建立名為 CustomClass 的實體,同時將新建立類別實體的參考指定給名為 customItem 的變數:
var customItem:CustomClass = new CustomClass();
如果您要宣告多個變數,可以使用逗號運算子 (,) 分隔變數,在一行程式碼中宣告所有變數。例如,下列程式碼會在一行程式碼中宣告三個變數:
var a:int, b:int, c:int;
您可以在同一行程式碼中為每一個變數指定值。例如,下列程式碼會宣告三個變數 (a、b 和 c),並為每個變數指定一個值:
var a:int = 10, b:int = 20, c:int = 30;
雖然您可以使用逗號運算子將變數宣告組成一個陳述式,但是這種作法可能會降低程式碼的可讀性。
變數的「範圍」是語彙參考可以在其中存取變數的程式碼區域。「全域」變數是定義於程式碼所有區域中的一種變數,而「區域」變數則是僅定義於程式碼一部分的一種變數。在 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); // 因為 strLocal 並非以全域方式定義而產生錯誤
如果您用於區域變數的變數名稱已宣告為全域變數,而區域變數位於範圍內時,區域定義會隱藏 (或遮蔽) 全域定義。全域變數仍會存在於函數之外。例如,下列程式碼會建立名為 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); // 全部都還是定義
}
trace(elemStr, valueStr, i); // 若 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
「預設值」是您設定變數值之前,變數所包含的值。首次設定變數的值時,就是在對變數進行「初始化」。如果宣告變數但未設定變數值,該變數就是「未初始化」。未初始化的變數值是依其資料類型而定。下表說明變數的預設值,依資料類型組織整理:
|
資料類型 |
預設值 |
|---|---|
|
Boolean |
|
|
int |
0 |
|
Number |
|
|
Object |
|
|
String |
null |
|
uint |
0 |
|
未宣告 (相當於類型註釋 |
|
|
所有其它類別,包括使用者定義的類別。 |
|
若是 Number 類型的變數,預設值為 NaN (非數字),這是以 IEEE-754 標準定義的特殊值,表示不代表數字的值。
如果您宣告變數,但並未宣告其資料類型,則會套用預設資料類型 *,這其實是表示該變數不具類型。如果也不用值初始化不具類型的變數,其預設值即為 undefined。
若是 Boolean、Number、int 和 uint 以外的資料類型,任何未初始化之變數的預設值都是 null。這適用於所有由 Flash Player API 定義的類別,以及您所建立的任何自訂類別。
null 值並不是類型為 Boolean、Number、int 或 uint 等變數的有效值。若嘗試指定 null 值給上述變數,該值即轉換為該資料類型的預設值。若是 Object 類型變數,則您可以指定 null 值。若嘗試指定 undefined 值給 Object 類型變數,該值即轉換為 null。
若是 Number 類型變數,會有名為 isNaN() 的特殊最高階函數,若變數不是數字,則會傳回 Boolean 值 true;否則會傳回 false。
Flash CS3
目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000043.html