推荐使用命名函数表达式实现递归,其内部名称仅在函数体内可见,可安全调用自身;变量引用和箭头函数配合赋值也是现代可行方案,而arguments.callee已废弃。

函数表达式实现递归,关键在于让函数能调用自身——但函数表达式本身没有名字,无法直接通过名称调用。解决办法是借助 命名函数表达式 或利用 arguments.callee(已废弃,不推荐),更现代、安全的方式是使用 变量引用 或 箭头函数配合变量赋值。
使用命名函数表达式(推荐)
给函数表达式起一个内部名称,该名称只在函数体内可见,可用于递归调用:
fact
- 确保变量未被重新赋值或置为
null/undefined - 适用于简单场景,但不如命名函数表达式健壮
arguments.callee
- ES5 严格模式下会抛出 TypeError
- 不利于代码压缩(如 minify 工具可能破坏其行为)
- 现代 JavaScript 明确不鼓励使用
箭头函数不能直接递归
箭头函数没有自己的 this 和 arguments,也没有 name 属性,且无法命名,因此不能像普通函数表达式那样自调用:
- 下面写法会报错:
const sum = (n) => n (若 <code>sum后续被覆盖则失效) - 若坚持用箭头函数,必须配合外部稳定标识(如模块级常量)或改用命名函数表达式











