let关键字声明变量具有块级作用域、不提升、不可重复声明、tdz限制及循环中独立绑定特性。

let 关键字在 JS 中通过声明时绑定块级作用域,让变量仅在定义它的花括号 {} 内有效,且不被提升、不可重复声明。
let 声明的变量只在当前块内可访问
块级作用域指由一对花括号 {} 包裹的区域,比如 if 语句、for 循环、函数体或显式代码块。用 let 声明的变量不会泄露到外层作用域:
-
✅ 正确示例:
if (true) { let x = 10; console.log(x); } // 输出 10<br>console.log(x); // ReferenceError: x is not defined -
⚠️ 对比 var:
if (true) { var y = 20; }<br>console.log(y); // 输出 20(var 是函数作用域,会“逃出”块)
let 不会发生变量提升(Temporal Dead Zone)
let 声明的变量从块开始到声明语句执行前,处于“暂时性死区”(TDZ),此时访问会报错:
console.log(a); // ReferenceError<br>let a = 5;
- 这和
var的“声明提升但值为undefined”有本质区别,强制要求先声明后使用。
同一作用域中不能重复声明 let 变量
防止意外覆盖,增强代码安全性:
let count = 1;<br>let count = 2; // SyntaxError: Identifier 'count' has already been declared
- 注意:不同块内可以同名声明,互不影响:
{ let id = 1; }<br>{ let id = 2; } // 合法,两个 id 属于各自块
for 循环中 let 实现真正的“每次迭代独立绑定”
这是 let 最典型的实用场景,解决闭包经典问题:
for (let i = 0; i setTimeout(() => console.log(i), 0); // 输出 0, 1, 2
- 因为每次循环都创建一个新的
i绑定,每个回调捕获的是各自块中的那个i。
而var i全局只有一个i,最终全部输出3。











