块级作用域通过花括号{}限定let/const变量的作用范围,仅在声明所在块内有效,外部访问报ReferenceError;嵌套块遵循就近原则,且存在暂时性死区(TDZ)。

块级作用域通过一对花括号 {} 划定明确的边界,let 和 const 声明的变量只在该 {} 内部有效,外部无法访问——这是它限制可见性的根本方式。
块级作用域的边界很具体
这些花括号不一定要属于某个语句,只要是语法合法的代码块就行:
- if、else、for、while、switch 等语句的大括号内
- 单独用 {} 包裹的一段代码(也叫“裸块”)
- 函数体内部的任意 {}(包括嵌套的)
只要变量用 let 或 const 在其中声明,它的生命就严格锁死在这个块里。
外部访问会直接报错
超出块范围后,变量名在语法上就“不存在”了:
立即学习“Java免费学习笔记(深入)”;
{ let name = "Alice"; }
console.log(name); // ReferenceError: name is not defined
这和 var 完全不同:var 在块内声明仍可能被函数或全局作用域访问到,而 let/const 不会泄漏出去。
嵌套块中遵循就近原则
如果多层 {} 嵌套,内层可以访问外层声明的 let/const,但外层看不到内层的:
{ let a = 1;
{ let b = 2;
console.log(a); // ✅ 可以,a 在外层块
console.log(b); // ✅ 可以,b 在当前块
}
console.log(b); // ❌ 报错,b 已超出作用域
}
注意:声明位置影响访问时机
let/const 有暂时性死区(TDZ),即使在块内,声明前也不能访问:
{ console.log(x); // ReferenceError!
let x = 10;
}
这不是作用域失效,而是语言规定:从块开始到声明语句执行前,该变量处于不可访问状态。


















