JavaScript深入之作用域链

JavaScript深入之作用域链
最新回答
只想说再见╮

2026-10-20 19:55:54

作用域链是JavaScript中用于查找变量的机制,由当前执行上下文的变量对象(VO/AO)和所有父级变量对象构成。

  • 函数创建阶段:函数定义时,其内部属性[[scope]]会保存所有父级变量对象的层级链。例如,嵌套函数bar的[[scope]]包含外层函数foo的活动对象(AO)和全局变量对象(VO)。

  • 函数激活阶段:

    创建执行上下文:函数被调用时,其执行上下文被压入执行上下文栈。

    初始化作用域链:复制函数的[[scope]]属性,创建初始作用域链。

    构建活动对象(AO):初始化包含arguments、形参、函数声明和变量声明的AO。

    更新作用域链:将AO压入作用域链前端,形成完整的作用域链(Scope = [AO].concat([[Scope]]))。

  • 变量查找过程:从当前上下文的AO开始,沿作用域链逐级向上查找变量,直到全局VO。若未找到,返回undefined。

  • 示例分析:

    var scope = "global scope";function checkscope() { var scope2 = 'local scope'; return scope2;}checkscope();

    创建阶段:checkscope.[[scope]]指向全局VO。

    激活阶段:

    创建checkscopeContext,初始化Scope为[globalContext.VO]。

    构建AO(含scope2),更新Scope为[AO, globalContext.VO]。

    执行阶段:访问scope2时直接从AO获取,访问scope则通过作用域链在全局VO中找到。

关键点:

  • 词法作用域:函数作用域在定义时确定,与调用位置无关。
  • 作用域链动态性:仅在函数激活时构建,执行期间保持不变。
  • 闭包原理:内层函数通过[[scope]]保留对外部AO的引用,即使外部函数执行完毕,其AO仍存在于内存中。

总结:作用域链是JavaScript实现变量访问的核心机制,理解其创建和查找过程对掌握闭包、变量提升等概念至关重要。