变量提升是指 javascript 引擎在执行代码前,先将所有变量声明和函数定义移动到当前作用域顶部的行为。理解这一机制的关键在于区分“声明”与“赋值”,以及掌握 `var`、`let` 和 `const` 在提升处理上的差异。通过明确变量在不同阶段的访问权限,可以有效避免 `referenceerror` 或意外的 `undefined` 值。

为什么 var 声明的变量会显示为 undefined
使用 var 声明的变量会被提升到作用域顶部并初始化为 undefined。这意味着在声明语句执行前访问该变量是合法的,但值为空。这种行为源于早期 JavaScript 的设计,旨在防止因未声明变量导致的运行时错误,但常引发逻辑混乱。

console.log(a); // undefined var a = 10; console.log(a); // 10
上述代码中,var a 被提升至顶部,等价于:var a;console.log(a);a = 10;console.log(a);
立即学习“Java免费学习笔记(深入)”;
为什么 let 和 const 存在暂时性死区
let 和 const 同样会被提升,但它们不会自动初始化为 undefined。从块级作用域开始到声明语句执行完毕前,这些变量处于“暂时性死区”(TDZ)。在此阶段访问变量会直接抛出 ReferenceError,强制开发者必须在使用前完成声明。

console.log(b); // ReferenceError let b = 20;
此行为确保了变量在使用前必须显式初始化,避免了 var 带来的隐式 undefined 陷阱。TDZ 的存在使得代码意图更清晰,减少了因变量提升导致的隐蔽 Bug。
函数表达式与函数声明的提升差异
函数声明(Function Declaration)会被完整提升,包括函数体,因此在声明前即可调用。而函数表达式(Function Expression)仅提升变量名,函数体保留在原位,导致在声明前调用会报错。这种差异决定了在需要前置调用的场景中应优先使用函数声明。
foo(); // 正常输出: "hello"
function foo() {
console.log("hello");
}
bar(); // TypeError: bar is not a function
var bar = function() {
console.log("world");
};在 bar 的例子中,var bar 被提升并初始化为 undefined,随后尝试调用 undefined 导致类型错误。这进一步验证了变量提升与赋值分离的原则。


















