什么是作用域链?如何查找变量?
请解释作用域链的概念,并说明 JavaScript 引擎如何沿着作用域链查找变量。
回答
Yahuda
作用域链(Scope Chain):由当前执行上下文及所有父级执行上下文的词法环境(Lexical Environment)组成的链式结构。
查找过程:
- 当前执行上下文创建时,其 Lexical Environment 包含一个
outer引用指向外层环境 - 访问变量时,先查找当前 Environment Record,如果找到则返回
- 如果未找到,沿
outer向上到外层环境查找 - 重复直到全局环境(全局环境的
outer为null) - 若全局也未找到,严格模式抛
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 环境, 全局环境]
注意:作用域链在函数定义时(词法分析阶段)就确定了,与调用位置无关。