【JavaScript】let、const 与 var 的区别

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
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容