作用域链决定变量查找优先顺序,从当前执行上下文的变量环境开始逐级向上搜索至全局环境;查找按函数定义时的词法嵌套关系固化,而非调用时堆栈;内层同名变量自然屏蔽外层,全局未找到则抛referenceerror。

作用域链决定变量查找的优先顺序,核心规则就一条:从当前执行上下文的词法环境开始,逐级向上搜索,直到全局环境为止。
查找起点是当前作用域的变量环境
每次函数执行时,JavaScript 引擎会为它创建一个执行上下文,其中包含一个变量环境(Variable Environment)和一条作用域链。变量查找的第一步,就是在当前函数自己的变量环境中找——包括参数、var/let/const 声明的变量、以及函数声明。
- 如果找到了,直接使用,不再继续往上查
- 没找到,就进入下一步:沿作用域链向上一级词法环境查找
向上查找严格按函数定义时的嵌套结构进行
作用域链不是运行时动态生成的,而是在函数**定义时**就固化下来的。它反映的是代码书写时的词法嵌套关系,而不是调用时的堆栈顺序。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- function inner() {} 写在 function outer() {} 里面 → inner 的作用域链就包含 outer 的词法环境
- 哪怕 outer 已经执行完毕、执行上下文被销毁,inner 仍能通过作用域链访问 outer 中的变量(这就是闭包)
- 如果 inner 被返回并 later 在别处调用,它依然沿原定义路径向上找,不会因为调用位置改变而跳转到新位置的作用域
全局作用域是查找的终点
当引擎沿着作用域链一路向上,最终到达全局词法环境(浏览器中是 window,Node.js 中是 globalThis)。这里存放着全局变量、内置对象(如 Array、Object)、以及全局声明的函数。
- 如果在全局也找不到该标识符,就会抛出 ReferenceError
- 注意:var 声明会被提升并初始化为 undefined;而 let/const 在声明前访问会触发暂时性死区(TDZ),报 ReferenceError,这不是查找失败,而是访问时机非法
同名变量按作用域层级自然覆盖
查找过程本身不比较变量名“谁更优先”,而是按链式顺序第一个匹配即止。因此,内层作用域中声明的同名变量会自然屏蔽外层的同名变量。
- 比如函数内 let a = 20,外层有 const a = 10,内部 console.log(a) 输出 20
- 这个“屏蔽”不是删除或覆盖外层变量,只是查找路径上先命中了内层的记录
- 想显式访问外层的 a,只能靠重命名或设计不同标识符,无法通过语法绕过作用域链规则
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










