函数声明会被完全提升至作用域顶部,支持先调用后定义及递归;函数表达式和箭头函数不提升,var 声明仅提升变量名,let/const 不提升且触发 tdz;块级函数声明在严格模式下为块作用域,推荐避免使用。

JavaScript 中函数声明会被提升到当前作用域顶部,这意味着可以在声明前调用它;但这种提升仅适用于 函数声明,不适用于函数表达式或箭头函数。
函数声明(Function Declaration)会被完全提升
函数声明在代码执行前就被解析并绑定到作用域中,因此可以“先调用后定义”。
- 提升的是整个函数定义(包括函数名和函数体)
- 在函数体内也能访问该函数名(支持递归调用)
- 同一作用域内多个同名函数声明,以最后一个为准
函数表达式(Function Expression)只提升变量名,不提升赋值
使用 const 或 let 声明的函数表达式不会被提升;用 var 声明时,变量名会被提升,但值仍为 undefined,调用会报错。
-
var foo = function() {};→foo提升,但初始值是undefined -
const bar = () => {};→ 不提升,提前访问会触发 Temporal Dead Zone(TDZ)错误
块级作用域中的函数声明行为有差异
在严格模式下,ES6 规定块级作用域(如 if、{})内的函数声明是块作用域的;但在非严格模式或某些旧环境里,可能被提升到外层函数或全局作用域。
- 推荐避免在块内声明函数,改用函数表达式或
let绑定的变量 - 现代引擎(Chrome、Firefox、Safari)已基本遵循 ES6 的块级函数声明语义
与 var/let/const 的提升规则对比
函数声明的提升优先级高于 var 变量提升,但低于 const/let 的 TDZ 约束。
- 函数声明 >
var声明(函数会覆盖同名var) -
let/const不提升,且禁止重复声明,与函数声明冲突时会报错 - 若存在同名函数声明和
let变量,即使未赋值也会导致 SyntaxError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











