var声明仅提升声明并初始化为undefined,赋值保留在原位置;创建阶段分配内存并设为undefined,执行阶段才赋值;重复声明被忽略;函数声明优先于var声明。

变量提升(Hoisting)中,var 声明会被“提升”到作用域顶部,但只是声明被提升,赋值不会。这意味着:在代码执行前,JavaScript 引擎会先扫描所有 var 声明,并为它们在当前作用域中创建绑定,初始值统一设为 undefined;而赋值语句仍保留在原位置,等到执行阶段才运行。
声明与初始化是两个独立阶段
JavaScript 引擎在进入执行上下文(如函数或全局环境)时,分两步处理 var:
-
创建阶段(Creation Phase):为每个
var变量在词法环境中分配内存空间,并初始化为undefined;此时还不会执行任何赋值操作。 -
执行阶段(Execution Phase):按代码顺序逐行执行,遇到赋值语句(如
a = 42)才真正写入值。
典型表现:访问未赋值的 var 不报错,但值是 undefined
例如:
console.log(a); // undefined<br>var a = 10;
立即学习“Java免费学习笔记(深入)”;
这不会报 ReferenceError,因为 a 已在创建阶段被声明并初始化为 undefined。它等价于:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
var a;<br>console.log(a); // undefined<br>a = 10;
var 的重复声明不报错,也不会覆盖已有值
多次用 var 声明同一个变量名,只有第一次声明生效(创建 + 初始化),后续声明被忽略:
-
var x = 1; var x = 2;→ 实际只执行一次声明,x初始为undefined,之后两次赋值依次执行,最终为2。 -
console.log(x); var x = 5;中,log输出undefined,不是5,更不是报错。
注意:函数声明优先于 var 声明
如果同名的函数声明和 var 声明共存,函数声明会完全覆盖 var 声明(包括其初始化):
console.log(foo); // [Function: foo]<br>var foo = 1;<br>function foo() {}
这是因为函数声明的提升优先级更高,且在创建阶段就完成初始化(指向函数对象),而 var foo 的初始化(undefined)被覆盖了。

















