函数声明提升优先于变量提升,即创建阶段先完整提升所有function声明(含函数体),再仅声明var变量(值为undefined);同名时函数先占位但可被后续赋值覆盖,let/const不提升,函数表达式仅提升变量名。

函数声明提升优先于变量提升,这是 JavaScript 执行上下文创建阶段的硬性规则。
提升顺序是固定的:先函数,后 var
在进入作用域(全局或函数)的创建阶段,引擎会:
- 扫描并完整提升所有 函数声明(
function foo() {}),包括函数名和函数体; - 再处理所有 var 声明(
var bar;),仅声明变量,初始值为undefined。
这意味着即使 var bar 写在 function bar() {} 前面,函数声明仍会先绑定到作用域中。
同名时函数声明先占位,但赋值可覆盖
当函数声明与 var 声明同名时:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 提升阶段:函数声明先绑定,
typeof bar是"function"; - 执行阶段:若后续有
bar = 123,则变量被重新赋值,typeof bar变为"number"。
例如:
var a = 42;<br>
function a() { return 'hello'; }实际等价于:
function a() { return 'hello'; }<br>
var a;<br>
a = 42;
let/const 和函数表达式不参与该顺序
这个“先函数后 var”的规则只适用于传统 function 声明和 var 声明:
-
let、const不提升,访问前处于暂时性死区(TDZ),直接报ReferenceError; - 函数表达式(如
var fn = function() {})只提升var fn部分,fn初始值为undefined,不是函数。
多个同名函数声明按出现顺序覆盖
同一作用域内多个 function a() {} 声明,后声明的会完全覆盖先声明的——这个覆盖发生在提升阶段,不是运行时行为。
例如:
function a() { return 1; }<br>
function a() { return 2; }<br>
console.log(a()); // 输出 2

















