javascript作用域链处理同名变量时遵循“就近原则”,即从当前执行上下文开始查找,遇到第一个同名变量即停止向上搜索,形成遮蔽效应;遮蔽不销毁外层变量,仅使其在当前作用域不可见。

JavaScript 作用域链处理同名变量时,遵循“就近原则”:从当前执行上下文的作用域开始查找,一旦遇到第一个同名变量就停止向上搜索,这个过程就是遮蔽效应的体现。
作用域链的查找方向是单向向上的
变量查找永远从最内层作用域(比如函数内部或块级作用域)出发,逐级向外(即向父级作用域、全局作用域)查找,不会跳过某一层去更外层找。只要当前层定义了同名变量,外层同名变量就被“遮蔽”,无法被访问。
- 例如:
let x = 10;在全局声明,函数内又写let x = 20;,函数中console.log(x)输出 20,全局的x被遮蔽 - 即使内部用的是
var、外部用let,只要名字相同且在可访问范围内,遮蔽依然发生 - 函数参数也参与遮蔽——
function fn(x) { console.log(x); }中,形参x会遮蔽同名的外部变量
遮蔽不等于删除,外层变量依然存在
被遮蔽的变量没有被销毁或覆盖,只是在当前作用域不可见。切换到未被遮蔽的作用域(比如退出函数),原来的变量仍可正常使用。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 全局
const api = 'v1';,函数内const api = 'v2';→ 函数内用api指向'v2',但全局api仍是'v1' - 嵌套函数中,中间层遮蔽了全局变量,最内层又遮蔽了中间层变量,每层都只看到自己声明的那个
不同声明方式对遮蔽的影响一致,但作用域边界不同
var、let、const 都会产生遮蔽效应,区别在于它们创建作用域的粒度:
-
var只有函数作用域,所以在if块里用var声明,仍会提升到函数顶部,可能意外遮蔽外层变量 -
let和const是块级作用域,在{}内声明,只在该块内遮蔽;块外不受影响 - 注意:
let/const不允许重复声明,但遮蔽本身是合法的——只要不是在同一作用域内重复声明
实际开发中要注意遮蔽带来的隐性问题
遮蔽本身是语言特性,不是 bug,但容易引发逻辑错误,尤其在重构或多人协作时:
- 修改函数参数名时,可能无意中与外部变量重名,导致原本想读取的值被遮蔽
- 复制粘贴代码片段时,若含同名
let声明,可能在新位置造成意外遮蔽 - 调试时发现变量值“不对”,先检查是否被内层同名变量遮蔽,而不是怀疑赋值逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










