如何区分 JavaScript 中的 var、let 和 const?

在 JavaScript 中,`var`、`let` 和 `const` 是用于变量声明的关键字,它们之间存在一些关键区别。

JavaScript 中等 变量 变量作用域 基础

在 JavaScript 中,varletconst 都用于变量声明,但它们在作用域、提升、可重用性和变异性上存在关键差异:

1. 作用域

  • var:具函数作用域或全局作用域(在函数外声明时为全局变量)。示例:
    function testVar() {
      if (true) {
        var a = 10;
      }
      console.log(a); // 10(可在函数内访问)
    }
    
  • let/const:具块级作用域(只在最近的大括号 {} 内有效)。示例:
    if (true) {
      let b = 20;
      const c = 30;
    }
    console.log(b); // ReferenceError(块外不可访问)
    console.log(c); // ReferenceError(块外不可访问)
    

2. 变量提升

  • var:声明会被提升至作用域顶部,赋值为 undefined
    console.log(x); // undefined
    var x = 5; 
    
  • let/const:会变量提升,但访问触发 暂时性死区(TDZ) 导致 ReferenceError
    console.log(y); // ReferenceError
    let y = 10;
    

3. 可重用性与赋值

  • 重声明
    • var:允许同作用域内重声明(不报错)。
      var num = 1;
      var num = 2; // 合法
      
    • let/const:禁止同作用域重声明。
      let value = 3;
      let value = 4; // SyntaxError
      
  • 重新赋值
    • var/let:可重新赋值。
      let count = 5;
      count = 6; // 合法
      
    • const:声明必须初始化且不可重新赋值,基本数据类型值不可变;但对引用类型(如对象),属性可修改(若需属性不变量冻结使用 Object.freeze()):
      const arr = [1, 2];
      arr.push(3); // 合法:数组属性可改
      arr = []; // TypeError(重新赋值非法)
      const obj = Object.freeze({ name: "Bob" });
      obj.name = "Alex"; // TypeError(属性修改无效)
      

4. 全局对象影响

  • var:全局作用域声明的变量会成为 window 对象的属性。
    var age = 25;
    console.log(window.age); // 25
    
  • let/const:不成为 window 属性:
    let height = 100;
    console.log(window.height); // undefined
    

使用建议

  • 优先使用 const(适用于非变量数据,避免意外变更)
  • 其次用 let(需修改的变量时)
  • 避免 var(老语法易触发意外作用域问题)