🐛
巴格
我明明把变量声明写在最后面,为什么前面就能用了?见鬼了!
x = 5; // 先使用
console.log(x); // 输出 5 (竟然没报错!)
var x; // 后声明
JS 队长
这就是 变量提升 (Hoisting)!
JS 引擎在运行代码前,会先把所有的 var 声明和 function 声明偷偷“坐电梯”搬到代码的最顶端。
🦸♂️
🛑 let 和 const 不坐电梯
let 和 const 比较守规矩。虽然它们在技术上也会被提升,但在你正式声明它们之前,它们处于“暂时性死区” (Temporal Dead Zone)。
x = 5; // ❌ 报错:Cannot access 'x' before initialization
let x;
⚠️ 只提升名字,不提升值
console.log(y); // 输出 undefined (不是 5!)
var y = 5;
这相当于:
var y; // 名字被提升了
console.log(y); // 此时 y 是 undefined
y = 5; // 赋值还在原地
🎮 预测未来
请预测下面代码的输出结果:
console.log(myVar);
var myVar = 10;