什么是变量提升(Hoisting)?var、let、const 的变量提升有何不同?
请解释变量提升机制,并对比 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;