写代码的时候,你有没有遇到过ref="/tag/144/" style="color:#479099;font-weight:bold;">变量莫名其妙变了值?或者在循环里定义的变量,跑到外面还能用?这很可能是因为你用了 var 而不是 let,它们看着差不多,其实差得挺远。
var 是老派做法,有点“太宽”
var 是 JavaScript 最早用来声明变量的方式。但它有个问题——作用域太大。用 var 声明的变量是函数作用域,也就是说,只要在一个函数里,不管你在哪声明的,它都能被访问到。
比如你在 if 语句里用 var 定义一个变量:
if (true) {
var name = "张三";
}
console.log(name); // 输出:张三
明明是在 if 里面定义的,结果外面也能拿到。这就容易出问题,尤其在复杂的逻辑里,别人根本不知道这个变量到底该不该存在。
let 更讲规矩,块级作用域
let 是 ES6 加进来的新关键字,它的作用域是块级的。所谓块,就是一对大括号 {} 包起来的部分。用 let 声明的变量,只在当前这个块里有效。
还是上面的例子,换成 let:
if (true) {
let name = "李四";
}
console.log(name); // 报错:name is not defined
这时候外面就拿不到 name 了,更安全,也更符合直觉。
变量提升也有区别
var 有变量提升,意思是你可以在声明之前使用它,虽然值是 undefined。
console.log(age); // 输出:undefined
var age = 25;
而 let 不允许这样。在声明之前使用 let 变量,会直接报错。
console.log(score); // 报错:Cannot access 'score' before initialization
let score = 90;
这其实是好事,避免了因为顺序写错导致的 bug。
命名习惯上也要注意
虽然 let 和 var 都能用来命名变量,但现代开发中,大家更推荐用 let(或 const)代替 var。尤其是在写监控脚本、数据处理逻辑时,变量太多、作用域混乱,很容易误改数据。
比如你在写一个网络请求监控的小脚本,统计失败次数:
for (let i = 0; i < requests.length; i++) {
let req = requests[i];
if (req.status === 500) {
let failCount = i + 1;
console.log(`第${failCount}次请求失败`);
}
}
// 这里的 i、req、failCount 全部只在 for 循环内有效,不会污染外部
要是用 var,这些变量全都会跑到外面去,万一别的地方也用了 i,那就乱套了。
实际建议
现在写 JS,基本可以忘记 var 了。let 和 const 才是主流。let 用于会变化的变量,const 用于不变的。命名时保持清晰,比如用 camelCase,别用 $ 或 _ 开头搞神秘。
尤其是做前端监控、日志收集这类功能时,变量一多,作用域管不好,查问题能查到怀疑人生。从一开始就用 let,少走弯路。