遮蔽是作用域内同名声明使外层变量暂时不可见,而非覆盖;let/const/var 均触发,参数也参与;遮蔽后内外变量独立,修改互不影响;可通过 console.log、Scope 面板或注释声明验证。

函数作用域内部声明同名变量,会屏蔽外部同名变量——这不是覆盖,而是查找路径被截断。JavaScript 按照词法作用域规则,在执行时从当前作用域开始向上搜索,一旦找到第一个匹配的声明,就停止继续查找,外层那个变量依然存在,只是“暂时不可见”。
遮蔽只发生在声明时,和变量类型无关
只要在函数或块级作用域内用 let、const 或 var 声明了同名标识符,就会触发遮蔽:
- let/const:声明即绑定,未声明前访问会报 ReferenceError(TDZ)
- var:因变量提升,声明会被“提前”,但赋值仍在原位置,遮蔽仍生效
- 参数名也参与遮蔽——函数参数本质上是该函数作用域的局部绑定
遮蔽不等于修改,外层变量完全不受影响
遮蔽只是让名字指向了新内存地址,两个变量彼此独立:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 全局 let count = 0,函数内 let count = 100 → 函数内改 count,不影响全局
- 即使外层是 const obj = {x: 1},内层 let obj = {x: 2} 也会遮蔽,生成全新对象
- 但若内层没重新声明 obj,只写 obj.x = 99,则修改的是外层对象本身,不触发遮蔽
怎么确认是否发生了遮蔽
调试时别靠猜,用这几个方法快速验证:
立即学习“Java免费学习笔记(深入)”;
- 在函数开头加 console.log(x),看输出是否符合内层预期值
- 浏览器开发者工具中打个断点,打开右侧 Scope 面板:如果 x 出现在 Local 下,说明已被遮蔽;若只在 Closure 或 Global 中出现,说明没遮蔽
- 临时注释掉内层的声明语句(如 // let x = 5),再运行对比行为变化
遮蔽只在当前作用域链内有效
它不会“污染”其他函数或作用域:
- 函数 A 内遮蔽了 x,不影响函数 B 对 x 的访问
- 嵌套函数中,遮蔽按层级逐级生效:最内层声明 > 外层函数参数 > 更外层变量 > 全局变量
- 不同函数各自的作用域互不干扰,哪怕它们都叫 inner

















