let声明变量具有块级作用域,不提升、不挂载全局对象,避免污染与闭包陷阱,并支持用裸露代码块隔离临时变量。

用 let 声明变量能天然限制作用域到当前代码块(如 {}、if、for、函数体等),避免意外挂载到全局对象(如浏览器中的 window 或 Node.js 中的 global),从而防止全局污染。
let 只在块级作用域内有效
let 声明的变量不会被提升到作用域顶部,也不能在声明前访问(暂时性死区),且只在最近的花括号 {} 内可见。这和 var 的函数作用域与变量提升有本质区别。
例如:
if (true) {
let x = 10;
console.log(x); // 10
}
console.log(x); // ReferenceError: x is not defined
这里 x 不会泄漏到 if 外部,更不会成为 window.x(浏览器中)。
循环中用 let 避免闭包陷阱
用 var 在循环中创建函数,常因变量共享导致所有函数引用同一个值;let 每次迭代都绑定新绑定,自然解决这个问题。
比如:
for (let i = 0; i console.log(i), 100); // 输出 0, 1, 2 }
若换成 var i,三个 setTimeout 都会输出 3 —— 因为 var 声明的 i 是函数作用域,循环结束后只剩一个 i,值为 3。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
不挂载到全局对象
在全局作用域用 let 声明变量,它属于“全局作用域”,但**不会作为属性添加到全局对象上**。
对比:
var a = 1; let b = 2; console.log(window.a); // 1(浏览器中) console.log(window.b); // undefined
这意味着用 let 声明的全局变量无法被脚本外的代码(如内联 <script></script> 或开发者工具直接读取 window.xxx)随意覆盖或误用,提升了安全性与可维护性。
配合块语句主动隔离逻辑
即使不在条件或循环中,也可以用裸露的代码块 {} 划定临时作用域,配合 let 管理临时变量,明确生命周期。
例如:
{
let temp = calculate();
doSomething(temp);
}
// temp 在这里已不可访问,不会干扰后续代码
这种写法适合一次性计算、配置解析、兼容性检测等场景,让变量“用完即弃”,降低命名冲突风险。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










