let 和 const 通过暂时性死区(tdz)和严格块级绑定实现变量隔离:声明前访问报错,块外不可见,不挂载全局对象,禁止重复声明;const 还要求初始化且不可重赋值。

let 和 const 在块级作用域中不靠“消除提升”来避免问题,而是通过改变提升后的行为——让变量进入暂时性死区(TDZ),同时严格绑定到花括号内,从而从机制上切断变量泄漏和提前访问的可能。
块级作用域天然隔离变量生命周期
只要有一对花括号 {},无论是否跟在 if、for、while 后面,甚至单独存在,就构成一个块级作用域。let/const 声明的变量只在这个块内有效,块外完全不可见。
for (let i = 0; i → 循环结束后 <code>i消失,不会泄露到函数或全局作用域-
{ let tmp = 'done'; } console.log(tmp);→ 直接报ReferenceError,无法访问 - 嵌套块中同名变量互不影响:
{ let x = 1; { let x = 2; console.log(x); } console.log(x); }输出 2 和 1
暂时性死区(TDZ)阻止“声明前使用”
let/const 确实会被提升到块顶部,但和 var 不同:它们提升后处于 TDZ,直到声明语句执行完成。在此期间任何访问(包括 typeof)都会抛出 ReferenceError,而不是返回 undefined。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
{ console.log(a); let a = 1; }→ 报错,不是undefined -
{ typeof b; let b = 2; }→ 同样报错,TDZ 对typeof也不豁免 - 这强制形成“先声明、后使用”的编码习惯,杜绝因提升导致的逻辑错乱
禁止重复声明 + 不挂载到全局对象
var 声明会自动成为全局对象(如 window)的属性,造成隐式全局污染;let/const 不会,且在同一块内重复声明直接语法报错。
-
var name = 'a'; console.log(window.name);→ 输出'a'(污染全局) -
let name = 'b'; console.log(window.name);→ 仍为原值(如空字符串),未新增属性 -
{ let x = 1; let x = 2; }→ SyntaxError,编译阶段即拦截
配合 const 进一步约束可变性
const 不仅具备 let 的所有块级与 TDZ 特性,还要求声明时必须赋值,且绑定不可重新赋值(注意:对象属性仍可修改)。这对配置项、DOM 引用、事件处理器等场景尤其有用。
-
const API_URL = 'https://api.example.com';→ 避免被意外覆盖 -
const btn = document.getElementById('submit');→ 引用固定,防止误重赋值 - 循环中用 const 替代 let(如
for (const item of list))更语义清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










