JavaScript变量提升指声明被移至作用域顶部:var声明与初始化为undefined一同提升;let/const仅声明提升,访问触发TDZ错误;函数声明完整提升可提前调用,函数表达式不提升。

JavaScript 的 hoisting(变量提升)是指在代码执行前,JavaScript 引擎会把 变量声明 和 函数声明 “提升”到当前作用域顶部的行为。注意:只有声明被提升,赋值不会被提升。
var 声明会被完全提升(声明 + 初始化为 undefined)
用 var 声明的变量,其声明会被提升到作用域顶部,并自动初始化为 undefined。所以你可以在声明前访问它,但值是 undefined,不会报错。
console.log(a); // undefinedvar a = 10;
这等价于:
var a; // 提升并初始化为 undefinedconsole.log(a); // undefineda = 10; // 赋值不提升
let 和 const 声明只提升声明,不初始化(存在暂时性死区 TDZ)
let 和 const 的声明会被提升,但不会被初始化。在声明语句执行前访问它们,会抛出 ReferenceError,这段区域就叫“暂时性死区”(Temporal Dead Zone)。
立即学习“Java免费学习笔记(深入)”;
console.log(b); // ReferenceError: Cannot access 'b' before initializationlet b = 20;
这是为了防止意外使用未初始化的变量,增强代码安全性。
函数声明会被完整提升(可提前调用)
函数声明(不是函数表达式)会被完整提升:声明和函数体都移到顶部,因此可以在定义前调用。
foo(); // 正常输出 "hello"function foo() { console.log("hello"); }
但函数表达式不会被提升(只有 var 声明部分提升,赋值不提升):
bar(); // TypeError: bar is not a functionvar bar = function() { console.log("world"); };
hoisting 不影响作用域,只影响声明位置感知
提升只发生在当前作用域内(全局或函数内),块级作用域(如 if 或 {})对 var 无效,但对 let/const 有效。不过要注意:var 没有块级作用域,所以:
if (false) { var x = 1; }console.log(x); // undefined(x 已声明,但未赋值)
而 let x 在块外访问直接报错,因为它根本没进入外部作用域。
基本上就这些。理解 hoisting 不是为了写出“先用后声明”的代码,而是避免因误解导致的意外行为。现代实践推荐优先使用 let 和 const,减少 var,让提升带来的模糊性降到最低。











