必须用 let/const 而非 var,因 var 存在变量提升和函数作用域问题;let 具块级作用域且每次循环迭代创建新绑定;const 表示绑定不可重赋值,非值不可变,对象属性仍可修改。

用 let 和 const 声明变量不是“更高级的写法”,而是必须理解其行为差异,否则很容易在闭包、循环或重赋值时出错。
为什么不能用 var 替代 let?
var 存在变量提升(hoisting)和函数作用域问题,而 let 是块级作用域且不提升。最典型的坑是循环中绑定事件:
for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 全部输出 3
}换成 let 就正常:
for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 100); // 输出 0, 1, 2
}-
var声明会被提升到函数顶部,i实际只有一个绑定 -
let每次迭代都创建新绑定,每个回调捕获的是各自作用域的i - 即使没写
{},if或for内部也是块级作用域
const 真的不能修改吗?
const 表示“绑定不可重新赋值”,不是“值不可变”。对象或数组本身仍可修改:
立即学习“Java免费学习笔记(深入)”;
const obj = { a: 1 };
obj.a = 2; // ✅ 允许
obj.b = 3; // ✅ 允许
obj = {}; // ❌ TypeError: Assignment to constant variable- 基本类型(
string、number、boolean)用const声明后确实不能改 - 引用类型(
Object、Array、Function)只能保证变量名不指向别的内存地址 - 想真正冻结对象,得用
Object.freeze(),但它是浅冻结
什么时候该用 let,什么时候用 const?
默认优先用 const,只有明确需要后续重新赋值时才换 let:
- 循环计数器(
for (let i = 0; ...))、临时中间值(let temp = x * 2)→ 用let - 配置项、DOM 元素引用、函数返回值、模块导入 → 统一用
const - 避免写
const x = ...; x = ...;这种语法错误,编辑器通常会立刻报错 - 团队协作中,
const能减少意外覆盖,比加注释更可靠
很多人以为 const 只是“声明常量”,其实它定义的是“不可重绑定的标识符”——这个语义细节决定了你在重构函数、提取变量或处理异步回调时会不会掉进作用域陷阱。











