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中找到。
关键点:
总结:作用域链是JavaScript实现变量访问的核心机制,理解其创建和查找过程对掌握闭包、变量提升等概念至关重要。