函数声明提升优先级最高,会完整提升并初始化函数体,var仅提升声明且初始值为undefined;同名时函数声明先绑定,后续var赋值可覆盖;let/const不适用此规则,函数表达式仅var部分提升。

函数声明在 JavaScript 中的变量提升(Hoisting)阶段具有最高优先级,会先于 var 变量声明被提升并初始化(即函数体被完整赋值),这是理解执行顺序的关键。
函数声明优先于 var 变量声明提升
在进入执行上下文的创建阶段,JavaScript 引擎会先扫描并提升所有函数声明(function foo() {...}),将其名称和完整定义一起绑定到当前作用域;随后才处理 var 声明,仅提升变量名,初始值为 undefined。这意味着即使函数声明写在 var 语句之后,它也能在代码顶部被调用。
-
注意:该规则仅适用于函数声明,不适用于函数表达式(如
var fn = function() {})或箭头函数,它们遵循var的提升规则 - 若同名的函数声明与
var声明共存,函数声明会覆盖var的声明(但不会覆盖后续的赋值)
同名函数声明之间的覆盖规则
当多个函数声明使用相同名称时,后出现的函数声明会覆盖先出现的——这是在提升阶段就完成的,不是运行时行为。最终只有最后一个函数声明生效。
- 例如:
function foo() { return 1; } function foo() { return 2; },调用foo()总是返回2 - 这种覆盖发生在编译/创建阶段,与执行顺序无关,也无需运行代码即可确定结果
函数声明 vs 函数表达式:提升差异明显
函数表达式被视为“赋值操作”,其左侧的 var 标识符会被提升,但右侧的函数体不会。因此,在声明前访问会得到 undefined,而非函数。
- 错误示例:
console.log(bar()); var bar = function() { return 'ok'; };→ 报错TypeError: bar is not a function - 正确写法:
var bar = function() { return 'ok'; }; console.log(bar());或改用函数声明
let/const 不参与传统变量提升,但存在暂时性死区(TDZ)
使用 let 或 const 声明的函数表达式(如 const fn = () => {})不会被提升;在声明前访问会直接抛出 ReferenceError,且无法像 var 那样取到 undefined。
- 即便写成
const fn = function() {},也不是函数声明,不享受提升特权 - ES6 起,推荐优先使用
const和函数表达式,明确意图并避免提升带来的混淆
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











