let 实现真正的块级作用域,变量仅在声明它的花括号 {} 内有效,支持嵌套遮蔽、循环迭代独立绑定,且作用域边界由 {} 明确界定,不等同于函数作用域。

JavaScript 中用 let 声明变量,就能实现真正的块级作用域限制——它让变量只在声明它的花括号 {} 内有效,出了这个范围就访问不到,也不会污染外层或全局环境。
let 的作用域边界很明确
只要变量是用 let 在某个代码块(比如 if、for、while 或任意一对 {})里声明的,它就只属于那个块:
if (true) { let x = 10; console.log(x); } console.log(x); // 报错:x is not definedfor (let i = 0; i- 哪怕只是手动写一对
{ let tmp = 'hello'; },tmp在块外也完全不可见
和 var 的关键区别:不提升 + 不绑定到函数作用域
let 不会像 var 那样被“提升”到作用域顶部,也不绑定到整个函数体:
console.log(a); let a = 1; // 报错:Cannot access 'a' before initialization(暂时性死区)function foo() { if (false) { let b = 2; } console.log(b); // 报错:b is not defined(b 并未挂到函数作用域上)}-
var在相同场景下会输出undefined或意外地取到函数内其他位置的值
循环中用 let 能避免闭包陷阱
这是 let 最实用的场景之一。每次迭代都会创建一个独立的绑定,而不是共享同一个变量:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
立即学习“Java免费学习笔记(深入)”;
for (let i = 0; i console.log(i), 0); } // 输出 0, 1, 2- 换成
var i就会全部输出3,因为所有回调都引用同一个i - 不用额外写 IIFE 或闭包包装,let 自带“每次迭代一个新变量”的语义
注意:块级作用域 ≠ 函数作用域
let 创建的是块级作用域,不是函数作用域。即使在函数内部,只要没用 {} 包裹,let 声明仍属于整个函数体;但一旦进了 {},作用域就立刻收紧:
function test() { let a = 1; { let b = 2; console.log(a); // OK } console.log(b); // 报错 }- 嵌套块中可以同名声明(形成遮蔽),外层变量不会被修改:
{ let x = 1; { let x = 2; console.log(x); } console.log(x); // 输出 2 和 1 }
不复杂但容易忽略:只要记住“let 看花括号”,有 {} 就有独立作用域,没有就按最近的函数或全局处理。用对了,变量泄漏和意外交互就少一大半。

















