函数声明会将函数名和函数体一同提升至作用域顶部,可提前调用;var 声明仅提升变量名,值为 undefined;同名时函数声明优先,但后续赋值会覆盖;函数表达式仅变量名提升,函数体不提升。

函数声明会把整个函数体提升到作用域顶部,而 var 声明只把变量名提升,值仍为 undefined,赋值操作留在原地。
函数声明提升:定义和调用都提前
用 function fn() { ... } 方式声明的函数,不仅名称被提升,函数体也一并提升。因此可以在声明前安全调用:
sayHello(); // 正常执行,输出 "Hi"function sayHello() { console.log("Hi"); }
var 变量提升:仅声明,不带赋值
var 声明会被提升,但初始化(即等号右边的值)不会。变量在提升后、赋值前处于“已声明未初始化”状态,访问时返回 undefined:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
console.log(a); // undefinedvar a = 123;- 实际执行顺序等价于:
var a; console.log(a); a = 123;
同名时函数优先,但赋值会覆盖
当函数声明与 var 声明同名,函数声明优先被提升并占据绑定;后续 var 声明不改变已有绑定,但赋值操作会覆盖函数引用:
立即学习“Java免费学习笔记(深入)”;
console.log(typeof foo); // "function"function foo() {}var foo;foo = 42;console.log(typeof foo); // "number"
函数表达式不提升,只提升变量名
用 var fn = function() {...} 这种方式,本质是 var 声明 + 函数赋值。只有 fn 名称被提升,值初始为 undefined,函数本身不会提前可用:
bar(); // TypeError: bar is not a functionvar bar = function() { console.log("ok"); };- 相当于:
var bar; bar(); bar = function() {...};

















