CodeWalk

什么是作用域链?如何查找变量?

作者:Yahuda · 2026-05-30 12:55

请解释作用域链的概念,并说明 JavaScript 引擎如何沿着作用域链查找变量。

回答

Yahuda

作用域链(Scope Chain):由当前执行上下文及所有父级执行上下文的词法环境(Lexical Environment)组成的链式结构。

查找过程

  1. 当前执行上下文创建时,其 Lexical Environment 包含一个 outer 引用指向外层环境
  2. 访问变量时,先查找当前 Environment Record,如果找到则返回
  3. 如果未找到,沿 outer 向上到外层环境查找
  4. 重复直到全局环境(全局环境的 outernull
  5. 若全局也未找到,严格模式抛 ReferenceError,非严格模式隐式创建全局变量

示例

let a = 1;
function outer() {
  let b = 2;
  function inner() {
    let c = 3;
    console.log(a + b + c); // inner → outer → 全局
  }
  inner();
}
outer();

inner 的作用域链:[inner 环境, outer 环境, 全局环境]

注意:作用域链在函数定义时(词法分析阶段)就确定了,与调用位置无关。