let和const命令

69 阅读2分钟

var

  • 作用域:函数作用域(function scope)。
    • 在函数内部声明的变量,只能在函数内部访问。
    • 在函数外部声明的变量,会成为全局变量。
  • 提升(Hoisting) :变量声明会被提升到函数或全局作用域的顶部,但赋值不会被提升。
  • 重复声明:允许重复声明同一个变量。
  • 全局属性:在全局作用域中声明的 var 变量会成为全局对象(如 window)的属性。 示例
function example() {
  if (true) {
    var x = 10; // 函数作用域
  }
  console.log(x); // 10,x 在函数内可访问
}
example();
console.log(x); // 报错,x 在函数外不可访问

let

  • 作用域:块级作用域(block scope)。
    • 在 {} 块内声明的变量,只能在块内访问。
  • 提升:变量声明会被提升到块级作用域的顶部,但在声明之前访问会触发“暂时性死区”(Temporal Dead Zone, TDZ)。
  • 重复声明:不允许重复声明同一个变量。
  • 全局属性:在全局作用域中声明的 let 变量不会成为全局对象的属性。 示例
function example() {
  if (true) {
    let y = 20; // 块级作用域
    console.log(y); // 20
  }
  console.log(y); // 报错,y 在块外不可访问
}
example();

const

  • 作用域:块级作用域(block scope)。
    • 与 let 相同,const 声明的变量只能在块内访问。
  • 提升:与 let 相同,存在暂时性死区。
  • 重复声明:不允许重复声明同一个变量。
  • 不可变性
    • 声明的变量必须初始化,且不能重新赋值。
    • 如果变量是对象或数组,其属性或元素可以修改。
  • 全局属性:在全局作用域中声明的 const 变量不会成为全局对象的属性。 示例
const z = 30; // 必须初始化
z = 40; // 报错,不能重新赋值
const person = { name: "Alice" };
person.name = "Bob"; // 允许修改属性
console.log(person.name); // Bob

三者区别

特性varletconst
作用域函数作用域块级作用域块级作用域
提升声明提升,赋值不提升声明提升,存在 TDZ声明提升,存在 TDZ
重复声明允许不允许不允许
可变性可重新赋值可重新赋值不可重新赋值
全局属性是全局对象的属性不是全局对象的属性不是全局对象的属性
初始化可不初始化可不初始化必须初始化
注意:避免使用var,优先使用const,必要时使用let