關于JS作用域鏈

執(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.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容