CodeWalk

什么是变量提升(Hoisting)?var、let、const 的变量提升有何不同?

作者:我还是少年 · 2026-05-30 12:55

请解释变量提升机制,并对比 var、let、const 在提升方面的区别。

回答

我还是少年

变量提升(Hoisting):在代码执行前,JS 引擎将变量声明和函数声明提升到当前作用域顶部的行为。

var 提升

  • 声明提升到作用域顶部,初始化为 undefined
  • 可在声明前访问(值为 undefined

let/const 提升

  • 声明也提升(创建了块作用域绑定),但未初始化
  • 存在暂时性死区(TDZ):从作用域开始到声明语句执行前,访问变量会抛出 ReferenceError
  • 直到执行到声明行才初始化,const 必须在声明时赋值

函数声明提升

  • 整体提升(声明 + 赋值),可以在声明前调用
  • 函数表达式(var f = function(){})仅变量名提升,函数体不提升

示例

console.log(a); // undefined
var a = 1;

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 2;