作用域链是函数创建时绑定的静态词法环境链,由[[environment]]指向定义时的外层环境,查找变量时沿链逐级向上,闭包可维持链有效;this绑定则发生在调用时,与作用域链无关。

JavaScript 中作用域链实现变量逐级查找,本质是函数创建时绑定的词法作用域(Lexical Environment)在运行时形成的**静态链式结构**,它不是动态搜索,而是沿着预定义的嵌套关系一层层向上找。
作用域链在函数创建时就已确定
每个函数对象内部都有一个隐藏属性 [[Environment]](规范中叫 [[OuterEnv]]),指向其**定义时所在的作用域环境**,而不是调用时。这个引用在函数被声明(或表达式求值)那一刻就固定了。
- 全局函数的 [[Environment]] 指向全局环境(Global Environment)
- 在 foo 函数内定义的 bar 函数,其 [[Environment]] 指向 foo 创建时的词法环境
- 嵌套越深,链越长,但路径是静态、不可变的
变量查找:从当前环境开始,沿链向上遍历
执行函数时,引擎会为它创建一个新的执行上下文,其中包含自己的词法环境(Local Environment)。查找变量时:
- 先在当前词法环境的“绑定对象”(如 AO/VO 或 LexicalEnvironment Record)里查
- 没找到,就通过 outer 引用跳到上一级词法环境继续查
- 直到到达全局环境;仍找不到就抛出 ReferenceError
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const x = 'global';
function foo() {
const x = 'foo';
function bar() {
const x = 'bar';
console.log(x); // 'bar' → 找当前环境
console.log(y); // ReferenceError → 全局也没 y
}
bar();
}
bar 的作用域链是:bar 环境 → foo 环境 → 全局环境。
闭包让上层环境“活下来”,链保持有效
即使外层函数执行结束,只要内层函数还存在(比如被返回或赋值给变量),它的 [[Environment]] 仍指向原外层环境,该环境不会被回收。
- 这使得闭包能持续访问外层函数的变量
- 作用域链不因调用结束而断裂,而是靠引用计数/垃圾回收机制维持
- 每个闭包实例都拥有自己独立的作用域链(哪怕来自同一函数)
注意:this 和作用域链无关
this 的绑定发生在函数调用时,由调用方式决定(如 obj.method()、call、箭头函数继承等),和词法作用域链完全独立。不要混淆变量查找与 this 查找。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










