JavaScript 中 let, const 和 var 的区别是什么?

推荐答案

在 JavaScript 中,letconstvar 都用于声明变量,但它们之间存在一些关键区别:

  1. 作用域

    • var 声明的变量具有函数作用域(function scope),即在函数内部声明的变量在整个函数内都有效。
    • letconst 声明的变量具有块级作用域(block scope),即只在声明它们的块(如 {})内有效。
  2. 变量提升

    • var 声明的变量会被提升到其作用域的顶部,这意味着你可以在声明之前访问它们,但值为 undefined
    • letconst 声明的变量也会被提升,但在声明之前访问它们会抛出 ReferenceError,这种现象称为“暂时性死区”(Temporal Dead Zone, TDZ)。
  3. 重复声明

    • var 允许在同一作用域内重复声明变量,后面的声明会覆盖前面的声明。
    • letconst 不允许在同一作用域内重复声明变量,否则会抛出 SyntaxError
  4. 值的可变性

    • varlet 声明的变量可以重新赋值。
    • const 声明的变量不能重新赋值,但如果声明的是对象或数组,其属性或元素可以被修改。

本题详细解读

1. 作用域

  • var

    • var 声明的变量具有函数作用域。这意味着在函数内部声明的变量在整个函数内都有效,甚至在声明之前也可以访问(尽管值为 undefined)。
    • 例如:
  • letconst

    • letconst 声明的变量具有块级作用域。这意味着它们只在声明它们的块(如 {})内有效。
    • 例如:

2. 变量提升

  • var

    • var 声明的变量会被提升到其作用域的顶部,这意味着你可以在声明之前访问它们,但值为 undefined
    • 例如:
  • letconst

    • letconst 声明的变量也会被提升,但在声明之前访问它们会抛出 ReferenceError,这种现象称为“暂时性死区”(Temporal Dead Zone, TDZ)。
    • 例如:

3. 重复声明

  • var

    • var 允许在同一作用域内重复声明变量,后面的声明会覆盖前面的声明。
    • 例如:
  • letconst

    • letconst 不允许在同一作用域内重复声明变量,否则会抛出 SyntaxError
    • 例如:

4. 值的可变性

  • varlet

    • varlet 声明的变量可以重新赋值。
    • 例如:
  • const

    • const 声明的变量不能重新赋值,但如果声明的是对象或数组,其属性或元素可以被修改。
    • 例如:
纠错
反馈