一個執行上下文 的資料(變數、函數宣告和函數的形參)作為屬性儲存在變數物件中。變數物件在每次進入上下文時創建,並填入初始值,值的更新出現在程式碼執行階段。
這一章專門討論與執行上下文直接相關的更多細節,這次我們將提及一個議題-作用域鏈。
如果要簡要的描述並展示其重點,那麼作用域鏈大多數與內部函數相關。
我們知道,ECMAScript 允許建立內部函數,我們甚至可以從父函數傳回這些函數。
var x = 10; function foo() { var y = 20; function bar() { alert(x + y); } return bar; } foo()(); // 30
這樣,很明顯每個上下文都有自己的變數物件:對於全域上下文,它是全域物件本身;對於函數,它是活動物件。
作用域鏈正是內部上下文所有變數物件(包括父變數物件)的列表。此鏈用來變數查詢。即在上面的例子中,「bar」上下文的作用域鏈包括AO(bar)、AO(foo)和VO(global)。
但是,讓我們仔細研究這個問題。
讓我們從定義開始,並進深一步的討論範例。
作用域鏈與一個執行上下文相關,變數物件的鏈用於在標識符解析中變數查找。
函數上下文的作用域鏈在函數呼叫時所建立的,包含活動物件和這個函數內部的[[scope]]屬性。下面我們將更詳細的討論一個函數的[[scope]]屬性。
在上下文中示意如下:
activeExecutionContext = { VO: {...}, // or AO this: thisValue, Scope: [ // Scope chain // 所有变量对象的列表 // for identifiers lookup ] };
其scope定義如下:
Scope = AO + [[Scope]]
這種聯合和標識符解析過程,我們將在下面討論,這與函數的生命週期相關。
以上就是JavaScript作用域鏈其一:作用域鏈定義作用域鏈其一:作用域鏈定義的內容,更多相關內容請關注PHP中文網(www.php.cn)!