关于JS作用域链

执行上下文

JavaScript引擎并不是一行一行的分析代码,而是一段一段的。在代码运行之前会进行内存分配,代码上下文关联的准备。我把这理解成执行上下文。
上下文主要有三个属性

activeExecutionContext == {
  VO : {...},  // or AO
  this: thisValue,
  Scope: [...]
}

其中VO或AO是变量对象,this为this指针,scope便为作用域链。

作用域链

每个上下文都有自己的变量对象。作用域链便是上下文中所有变量对象的列表,与执行上下文相关。可用于在标识符解析中变量查找。
举个例子,当这段代码执行时

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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容