javascript如何声明变量_let和const有什么区别【教程】

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

letconst 声明变量不是“更高级的写法”,而是必须理解其行为差异,否则很容易在闭包、循环或重赋值时出错。

为什么不能用 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
  • 即使没写 {}iffor 内部也是块级作用域

const 真的不能修改吗?

const 表示“绑定不可重新赋值”,不是“值不可变”。对象或数组本身仍可修改:

const obj = { a: 1 };
obj.a = 2;        // ✅ 允许
obj.b = 3;        // ✅ 允许
obj = {};         // ❌ TypeError: Assignment to constant variable
  • 基本类型(stringnumberboolean)用 const 声明后确实不能改
  • 引用类型(Obje

    ct
    ArrayFunction)只能保证变量名不指向别的内存地址
  • 想真正冻结对象,得用 Object.freeze(),但它是浅冻结

什么时候该用 let,什么时候用 const

默认优先用 const,只有明确需要后续重新赋值时才换 let

  • 循环计数器(for (let i = 0; ...))、临时中间值(let temp = x * 2)→ 用 let
  • 配置项、DOM 元素引用、函数返回值、模块导入 → 统一用 const
  • 避免写 const x = ...; x = ...; 这种语法错误,编辑器通常会立刻报错
  • 团队协作中,const 能减少意外覆盖,比加注释更可靠

很多人以为 const 只是“声明常量”,其实它定义的是“不可重绑定的标识符”——这个语义细节决定了你在重构函数、提取变量或处理异步回调时会不会掉进作用域陷阱。