let 和 const 的区别:JavaScript 变量声明的正确打开方式

ref="/tag/137/" style="color:#8B0506;font-weight:bold;">JavaScript 的时候,变量声明是每天都要打交道的事。以前大家习惯用 var,但现在 let 和 const 才是主流。虽然它们看起来差不多,但用错了容易出问题,尤其是新手。

var 的坑,let 填上了

先说个常见场景:你在写一个循环,想在每次迭代里用一个变量存临时值。

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}

你以为会输出 0、1、2?结果是三个 3。因为 var 是函数作用域,循环结束时 i 已经变成 3 了,而 setTimeout 是异步执行的。

换成 let 就不一样了:

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}

这次输出的就是 0、1、2。因为 let 是块级作用域,每次循环都会创建一个新的 i,每个 setTimeout 拿到的是各自那一轮的值。

const 不是“常量”的全部意思

很多人以为 const 声明的是“不可变的变量”,其实准确说是“不可重新赋值的变量”。

const name = '小明';
name = '小红'; // 报错:Assignment to constant variable.

这行不通。但如果是对象或数组,内容还是能改的:

const user = { name: '小明' };
user.name = '小红'; // 没问题

const list = [1, 2];
list.push(3); // 也可以

所以 const 阻止的是“重新赋值”,不是“禁止修改”。真想冻结对象,得用 Object.freeze()。

怎么选?有个简单习惯

现在写代码,可以养成一个习惯:默认用 const,除非你明确要重新赋值,那就用 let。

比如定义一个配置项、一个固定的 DOM 元素引用,用 const 很合适。如果是个计数器、状态标志需要改变,就用 let。

var 基本可以退休了,它没有块级作用域,容易造成变量提升和意外覆盖,现代开发中基本见不到了。

实际项目中的选择

比如你在写一个表单验证函数:

function validateForm(data) {
  const requiredFields = ['name', 'email'];
  let isValid = true;

  for (let field of requiredFields) {
    if (!data[field]) {
      isValid = false;
      break;
    }
  }

  return isValid;
}

requiredFields 是固定的,用 const;isValid 会在循环中被修改,所以用 let;循环变量 field 用 let,确保不会污染外部作用域。

这种写法清晰又安全,团队协作时别人一看就知道哪个值是固定的,哪个可能会变。