写 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,确保不会污染外部作用域。
这种写法清晰又安全,团队协作时别人一看就知道哪个值是固定的,哪个可能会变。