JavaScript的块级作用域通过let和const实现,变量仅在声明所在的花括号{}内有效,受TDZ约束且不提升,与var的函数作用域形成关键区别。

JavaScript 的块级作用域是通过 let(以及 const)声明变量时,让变量仅在所在的代码块(即一对花括号 {} 内)中有效来实现的。
let 声明绑定到最近的代码块
let 不像 var 那样提升到函数或全局作用域顶部,而是严格绑定到它被声明的那个块级作用域中。这个“块”可以是 if、for、while 语句的花括号,也可以是显式用 {} 包裹的代码段。
if (true) { let x = 1; console.log(x); } console.log(x); // ReferenceErrorfor (let i = 0; i console.log(i), 0); } // 输出 0, 1, 2(每个循环迭代都有独立的 i)
与 var 的关键区别:作用域边界不同
var 只有函数作用域(或全局作用域),即使写在 if 或 for 块里,也会被提升到函数顶部;而 let 真正受花括号限制,出了块就不可访问。
function fn() { if (true) { var a = 1; let b = 2; } console.log(a); // 1(var 可访问) console.log(b); // ReferenceError(let 不可访问) }- 这种边界感让逻辑更可预测,避免意外覆盖或访问未初始化变量。
暂时性死区(TDZ)强化了块级约束
let 声明的变量从块开始到声明语句执行前,处于“暂时性死区”。在这期间访问会报 ReferenceError,而不是返回 undefined。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
{ console.log(x); let x = 1; } // ReferenceError- TDZ 是块级作用域的配套机制,确保变量必须先声明再使用,进一步隔离块内环境。
块级作用域不依赖函数,但需显式块结构
只要有一对花括号,哪怕没写 if、for 等关键字,也能创建块级作用域:
{ let tmp = 'hello'; console.log(tmp); } console.log(tmp); // ReferenceError- 这种显式块常用于临时隔离变量,比如模块初始化、测试环境清理等场景。
不复杂但容易忽略。

















