2 回答

TA貢獻(xiàn)1803條經(jīng)驗(yàn) 獲得超6個(gè)贊
JavaScript中所有的量都是存在于某一個(gè)作用域中的
除了全局作用域, 每一個(gè)作用域都是存在於某個(gè)作用域中的
在試圖訪問一個(gè)變量時(shí)JS引擎會(huì)從當(dāng)前作用域開始向上查找直到Global全局作用域停止
例如
1 2 3 4 5 6 7 8 9 10 | var A;//全局作用域 function B() { var C;//C位于B函數(shù)的作用域 function D() { var E;//E位于D函數(shù)的作用域 alert(A) } } |
當(dāng)alert(A)時(shí), JS引擎沿著D的作用域, B的作用域, 全局作用域的順序進(jìn)行查找.
這三個(gè)作用域組成的有序集合就成為作用域鏈
至于為什么叫鏈, 你可以理解和鏈表有相似之處, 深層的作用域會(huì)能夠訪問到上層作用域, 就如同鏈表中兩個(gè)連續(xù)節(jié)點(diǎn)能夠單向訪問一樣

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
執(zhí)行上下文
每當(dāng)控制器到達(dá)ECMAScript可執(zhí)行代碼的時(shí)候,控制器就進(jìn)入了一個(gè)執(zhí)行上下文.
執(zhí)行上下文是個(gè)抽象概念,標(biāo)準(zhǔn)中沒有從技術(shù)實(shí)現(xiàn)上定義執(zhí)行上下文的具體結(jié)構(gòu)和類型.
就是一系列活動(dòng)的執(zhí)行上下文從邏輯上形成一個(gè)棧(比較抽象).
棧底總是全局上下文,棧頂是當(dāng)前(活動(dòng)的)執(zhí)行上下文.
當(dāng)在不同的執(zhí)行上下文間切換(退出而進(jìn)入新的執(zhí)行上下文)的時(shí)候,棧會(huì)被修改(通過壓棧或者出棧的形式).
變量對(duì)象
執(zhí)行上下文的數(shù)據(jù)是以變量對(duì)象的屬性形式進(jìn)行存儲(chǔ)的.
一個(gè)變量對(duì)象(簡寫為VO)是一個(gè)和執(zhí)行上下文相關(guān)的特別對(duì)象,存儲(chǔ)以下內(nèi)容:
變量(聲明的變量,var)
函數(shù)聲明(簡寫為FD)
在上下文中,函數(shù)聲明的形式參數(shù)
作用域鏈
作用域鏈?zhǔn)且粭l變量對(duì)象的鏈,它和執(zhí)行上下文有關(guān),用于在處理標(biāo)識(shí)符的時(shí)候進(jìn)行變量查詢.
函數(shù)上下文的作用域鏈在函數(shù)調(diào)用的時(shí)候創(chuàng)建出來,它包含了活躍對(duì)象和該函數(shù)的內(nèi)部[[Scope]]屬性.
執(zhí)行上下文變量大致如下:
activeExecutionContext = {
VO:{...},//或者AO
this:thisValue,
Scope:[
//作用域鏈,所有變量對(duì)象的列表,用來查詢標(biāo)識(shí)符
]
}
上面Scope可以定義如下:
Scope = AO+[[Scope]]
可以用數(shù)組進(jìn)行表示:
var Scope = [VO1,VO2,...,VOn];//作用域鏈