函数体只在被明确调用时才执行;函数声明会提升(含函数名和定义),但不执行;调用必须加括号,否则仅为引用;执行时机取决于调用位置与上下文;函数表达式无提升,需先赋值再调用。

JavaScript 函数声明的调用时机,核心就一点:函数体只在被明确调用时才执行,声明本身不会触发任何运行。
函数声明会提升,但不执行
使用 function 关键字声明的函数(即函数声明)会被“提升”(hoisting)到当前作用域顶部。这意味着你可以在声明语句之前就调用它,代码仍能正常运行:
- 函数名和整个函数定义都会被提前解析
- 但函数内部的代码块(函数体)依然不会运行,直到你写下
fn() - 例如:
sayHello(); // ✅ 可以正常执行<br>function sayHello() { console.log('Hi!'); }
调用必须带括号,否则只是引用
写函数名不加 (),JavaScript 不会执行它,只会把它当作一个值(函数对象)来处理:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
myFunc→ 获取函数本身,可用于赋值、传参或检查类型 -
myFunc()→ 真正触发执行,进入函数体运行代码 - 漏掉括号是常见错误,比如
setTimeout(myFunc, 1000)是传函数,setTimeout(myFunc(), 1000)是立即执行后传返回值
执行时机取决于调用位置和上下文
函数何时运行,完全由你在哪里、以什么方式调用它决定:
立即学习“Java免费学习笔记(深入)”;
- 直接写
doWork()→ 同步立即执行 - 作为事件回调:
button.addEventListener('click', handleClick)→ 点击时才执行 - 在定时器中:
setTimeout(apiCall, 2000)→ 2秒后执行 - 在异步操作里:
fetch(...).then(handleResponse)→ 响应返回后执行
函数表达式没有提升,调用前必须已赋值
如果你用的是函数表达式(如 const fn = function() {...} 或箭头函数),它不会被提升:
- 在声明语句之前调用会报
ReferenceError - 必须确保变量已初始化,才能安全调用
fn() - 这是和函数声明最关键的区别之一

















