ES6 之前 JavaScript 只有 var 一种变量声明方式,它的作用域规则和提升行为经常导致难以排查的 bug。ES6 引入的 let 和 const 解决了这些问题,现在的开发中应当默认使用 let 和 const,几乎不再使用 var。
1. 作用域差异
var 声明的变量只有函数作用域,let 和 const 拥有块级作用域(花括号范围):
function test() {
if (true) {
var a = "var变量";
let b = "let变量";
}
console.log(a); // var变量,函数内可访问
console.log(b); // ReferenceError,b 只在块内存在
}
2. 变量提升与暂时性死区
var 声明会被提升到函数顶部,声明前访问得到 undefined 而不报错;let 和 const 也存在提升,但声明前访问会直接抛错,这段区间称为「暂时性死区」:
console.log(x); // undefined(提升但未赋值)
var x = 1;
console.log(y); // ReferenceError(暂时性死区)
let y = 2;
暂时性死区把「忘了声明就用」这类问题从运行时的静默错误变成了显式报错,是 let 更安全的直接原因。
3. 重复声明
var x = 1;
var x = 2; // 合法,x 被覆盖
let y = 1;
let y = 2; // SyntaxError,同作用域不允许重复声明
4. const 与不可变绑定
const 声明的是「不可重新赋值的绑定」,而不是「不可变的数据」:
const num = 1;
num = 2; // TypeError,不能重新赋值
const list = [1, 2];
list.push(3); // 合法!数组内容可以修改
console.log(list); // [1, 2, 3]
想让对象内容也不可变,需要配合 Object.freeze(),它只冻结第一层属性。
5. 使用建议
声明变量时的优先级:默认 const,需要重新赋值才用 let,不再使用 var。这样 review 代码时,看到 const 就能确定它不会中途被换掉。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








暂无评论内容