Flash CS3 文件 |
|||
| ActionScript 3.0 程式設計 > ActionScript 語言和語法 > 函數 > 函數範圍 | |||
函數的範圍不僅決定程式中可以呼叫函數之處,而且可以決定函數能存取的定義。套用至變數識別名稱的範圍規則也可套用至函數識別名稱。全域範圍中的函數宣告在整個程式碼中都可以使用。例如,ActionScript 3.0 包含全域函數,例如 isNaN() 和 parseInt(),可在程式碼任何一處使用。巢狀函數 (在另一個函數內宣告的函數) 可用在其宣告函數中的任何一處。
只要函數一開始執行,就會建立一些物件和屬性。首先建立稱為「啟動物件」的特殊物件,其中儲存參數及任何區域變數,或是在函數主體中宣告的函數。您不能直接存取啟動物件,因為它是內部機制。接著會建立「範圍鏈」,其中包含 Flash Player 檢查會識別名稱宣告的物件順序清單。每一個執行的函數都有儲存在內部屬性中的範圍鏈。對巢狀函數來說,範圍鏈是自其本身的啟動物件開始,後面加上其父函數的啟動物件。範圍鏈以這種方式繼續,直至達到全域物件為止。全域物件是在 ActionScript 程式開始時建立,並包含所有全域變數和函數。
「函數結束項」是物件,其中包含函數及其語彙環境的快照。函數的語彙環境包含函數之範圍鏈中的所有變數、屬性、方法和物件,以及其值。只要在函數物件或類別之外執行函數,就會建立函數結束項。由於函數結束項保留其定義範圍的情況,當函數傳遞為引數或傳回值至不同範圍中時,就會產生有趣的結果。
例如,下列程式碼會建立兩個函數:foo() 會傳回名為 rectArea() 的巢狀函數,可計算矩形區域;而 bar() 會呼叫 foo() 並將傳回的函數結束項儲存在名為 myProduct 的變數中。即使 bar() 函數定義其自身的區域變數 x (值為 2),當呼叫函數結束項 myProduct() 時,它會保留定義於函數 foo() 中的變數 x (值為 40)。因此 bar() 函數會傳回 160 這個值,而不是 8。
function foo():Function
{
var x:int = 40;
function rectArea(y:int):int // 定義的函數結束項
{
return x * y
}
return rectArea;
}
function bar():void
{
var x:int = 2;
var y:int = 4;
var myProduct:Function = foo();
trace(myProduct(4)); // 呼叫的函數結束項
}
bar(); // 160
方法表現的行為方式也類似,它們也會保留有關建立其自身的語彙環境資訊。這項特性在從其實體擷取方法時最顯著,它會建立繫結方法。函數結束項與繫結方法之間的主要差異在於,在繫結方法中 this 關鍵字的值一定都是參考原始附加的實體;而在函數結束項中,this 關鍵字的值則可以變更。如需詳細資訊,請參閱繫結方法。
Flash CS3
目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000057.html