執(zhí)行上下文
JavaScript引擎并不是一行一行的分析代碼,而是一段一段的。在代碼運行之前會進行內存分配,代碼上下文關聯(lián)的準備。我把這理解成執(zhí)行上下文。
上下文主要有三個屬性
activeExecutionContext == {
VO : {...}, // or AO
this: thisValue,
Scope: [...]
}
其中VO或AO是變量對象,this為this指針,scope便為作用域鏈。
作用域鏈
每個上下文都有自己的變量對象。作用域鏈便是上下文中所有變量對象的列表,與執(zhí)行上下文相關??捎糜谠跇俗R符解析中變量查找。
舉個例子,當這段代碼執(zhí)行時
var x = 10;
bar()
function bar(){
var x = 30;
function foo(){
console.log(x)
}
foo();
}
全局上下文的變量對象是:
globalContext.VO == {
x: 10
bar: <reference to function>
}
bar被調用后的上下文活動對象:
barContext.AO == {
x: 30
foo: <reference to function>
}
bar的上下文作用域鏈便為:
barContext.Scope == [
barContext.AO,
globalContext.VO
]
而接著foo被調用后其作用域鏈便為
fooContext.Scope == [
fooContext.AO,
barContext.AO,
globalContext.VO
]
當解析a標識符時,便依據作用域鏈去查找。
fooContext.AO // not found
barContext.AO // found - 30
globalContext.VO
在bar的變量對象中找到30,便停止查找,返回30.