函数表达式需通过变量名调用,推荐赋值后使用;命名函数表达式可在内部用函数名实现递归,语义清晰且不污染外部作用域。

函数表达式本身是匿名的,不能像函数声明那样直接通过函数名调用自己;但可以通过变量名引用它,或在内部用 arguments.callee(已废弃)、命名函数表达式(Named Function Expression)等方式实现自引用。
通过变量名调用函数表达式
最常用也最推荐的方式:把函数表达式赋值给一个变量,之后用该变量名调用函数。
- 函数表达式定义后,变量就持有该函数的引用,可多次调用
- 注意变量必须在定义之后使用,否则会报
ReferenceError(若用let/const声明)
示例:
const sayHello = function() {
console.log('Hello!');
};
sayHello(); // ✅ 正常调用命名函数表达式实现内部自调用
在函数表达式中添加一个名字(即“命名函数表达式”),该名字仅在函数内部可见,可用于递归或调试。
- 函数名不会污染外部作用域
- 函数体内可通过该名字实现递归调用,比
arguments.callee更安全、语义更清晰 - 即使赋值给另一个变量,函数内部的名称仍有效
示例(计算阶乘):
const factorial = function fact(n) {
if (n 避免使用 arguments.callee
arguments.callee 曾用于匿名函数内指向自身,但在严格模式下已被禁用,且影响性能和优化,不建议使用。
- 现代代码应优先采用命名函数表达式替代
- ES6+ 环境中该属性不可访问,会抛出
TypeError
常见误区提醒
容易混淆函数声明与函数表达式的行为:
- 函数声明会被提升(hoisted),可先调用后定义;函数表达式不会提升,必须先定义再调用
- 命名函数表达式的名称不能在外部访问:
fact(5)会报错,只能通过变量名factorial(5) - 箭头函数没有自己的
this和arguments,也不支持命名函数表达式语法,无法用名称自调用










