优先用let,基本不用var;let具有块级作用域、存在暂时性死区、禁止重复声明且可修改值,适用于循环计数器、条件分支临时变量等需重新赋值的场景。

优先用 let,基本不用 var。现代 JavaScript 开发中,var 因函数作用域、变量提升、重复声明不报错等问题,容易引发隐蔽 bug,已不推荐在新代码中使用。
什么时候该用 let
let 适用于大多数需要可变值的场景——只要这个值后续可能被重新赋值,且作用范围明确在某个代码块内(比如 if、for、函数体)。
- 循环计数器:避免闭包陷阱,每次迭代拥有独立绑定
- 条件分支中的临时变量:如
if (user) { let name = user.name; ... } - 函数内部逻辑中间值:如处理数组后暂存结果
为什么不该用 var
var 的设计缺陷在实际开发中常导致意外行为:
- 在
if或for块里声明,却能在块外访问,破坏封装性 - 变量提升导致未赋值时读取为
undefined,掩盖逻辑错误 - 同一作用域重复声明不报错,旧值被静默覆盖,调试困难
- 全局声明会自动挂到
window(浏览器)上,污染全局命名空间
let 和 const 的配合原则
不单独只考虑 let vs var,而应建立“const 优先,let 次之,var 避免”的习惯:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 声明即初始化,之后不再重新赋值 → 用
const(如配置项、DOM 元素引用、函数表达式) - 需要中途修改值(如累加、状态切换、循环更新)→ 用
let - 老项目维护或兼容极旧环境(ES5)→ 才考虑
var,但应加注释说明原因
一个典型对比示例
下面代码清晰体现差异:
循环中声明计数器// ❌ var:三个函数都输出 3
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100);
}
// ✅ let:分别输出 0、1、2
for (let j = 0; j < 3; j++) {
setTimeout(() => console.log(j), 100);
}
根本原因:var 的 i 是函数作用域共享变量;let 的 j 在每次迭代中创建新绑定。

















