函数声明提升使函数可在定义前调用,引擎将整个函数体提升至作用域顶部;同名时函数声明覆盖var变量声明;块级作用域中函数提升受限且受tdz约束;函数表达式仅变量名提升,函数体不提升。

JavaScript 函数声明提升最直接的应用,就是允许你在函数定义之前调用它——只要它是用 function 关键字声明的普通函数,而不是函数表达式。
函数声明能提前调用
这是提升最直观的体现。比如:
-
greet();可以正常执行,即使function greet() {...}写在后面 - 引擎在执行前就已把整个函数体“拎”到作用域顶部,所以调用时函数已就绪
- 适用于普通函数、
async function、function*和async function*
同名声明时函数优先于变量
当函数声明和 var 变量同名,函数声明会覆盖变量声明(在提升阶段):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
foo();输出"function",不是undefined或报错 - 即使
var foo = 123;出现在函数前面,函数声明仍占主导 - 但后续赋值(如
foo = 456;)会覆盖函数引用
块级作用域中要特别小心
ES6 严格模式下,if 或 {} 块内声明的函数不会提升到外层:
-
if (true) { function bar() {} }→bar在块外不可访问 - 提前调用会报
ReferenceError,因为进入暂时性死区(TDZ) - 这不是“不提升”,而是提升范围被限制在块内,且受 TDZ 约束
函数表达式不享受完整提升
用 var fn = function() {} 定义时,只有变量名被提升,函数体不会:
-
fn();报TypeError: fn is not a function - 因为提升后
fn是undefined,不是函数 - 这和
let/const函数表达式不同:后者连变量名都不提升,直接报ReferenceError
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










