var、let、const 有什么区别?什么是变量提升和暂时性死区?

var vs let vs const

特性 var let const
作用域 函数作用域 块级作用域 块级作用域
变量提升 ✅ 提升且初始化为 undefined ✅ 提升但不初始化 ✅ 提升但不初始化
重复声明 允许 不允许 不允许
重新赋值 允许 允许 不允许
挂载到 window ✅ ❌ ❌

变量提升(Hoisting)

console.log(a)  // undefined(已提升,已初始化)
var a = 1

console.log(b)  // ReferenceError(已提升,但未初始化)
let b = 2

var 声明会在编译阶段被提升到作用域顶部并初始化为 undefined。

暂时性死区(TDZ)

let / const 声明的变量虽然也会提升,但在到达声明语句之前处于暂时性死区,访问会抛出 ReferenceError。

{
  // TDZ 开始
  console.log(x)  // ReferenceError
  let x = 10       // TDZ 结束
}

const 必须在声明时初始化:

const a          // SyntaxError
const b = 1      // ✅
b = 2            // TypeError

注意:const 不可重新赋值,但对象/数组的内容可以修改:

const arr = [1, 2]
arr.push(3)     // ✅ 允许修改内容
arr = [4, 5]    // ❌ 不可重新赋值

最佳实践

同分类其他题目