arguments.callee 指向当前执行的函数对象,使匿名函数能通过它实现递归调用;但因严格模式禁用、兼容性差且影响可读性与调试,现已不推荐使用。

在 JavaScript 中,arguments.callee 曾用于在函数内部引用当前正在执行的函数,从而实现匿名函数的递归调用。但它已被严格模式禁用,且现代开发中不推荐使用,存在兼容性、可读性和调试问题。
为什么 arguments.callee 能“调用自身”?
arguments.callee 指向当前正在执行的函数对象(即包裹 arguments 的那个函数)。在匿名函数中,由于没有函数名,无法直接写函数名来递归,于是过去有人借助它:
// 旧写法(不推荐)
(function(n) {<br>
if (n <= 1) return 1;<br>
return n * arguments.callee(n - 1); // 递归调用自身<br>
})(5); // → 120
arguments.callee 的主要问题
- 在
"use strict"模式下抛出TypeError(不可访问) - 阻碍 JS 引擎优化(如尾调用优化、内联等)
- 使代码难以阅读和调试(函数名缺失,堆栈追踪不清晰)
- ES6+ 标准已将其列为废弃特性,所有主流环境都明确不鼓励使用
现代替代方案(推荐)
-
给函数命名(即使是具名函数表达式):
(function factorial(n) {<br> return n <= 1 ? 1 : n * factorial(n - 1);<br> })(5); -
使用普通函数声明(有名字、可递归、语义清晰):
function factorial(n) {<br> return n <= 1 ? 1 : n * factorial(n - 1);<br> } -
箭头函数 + 变量赋值(注意:需确保变量已声明):
const factorial = (n) => n
特殊情况:立即执行且必须匿名?
极少数场景(如某些压缩/混淆约束),若真无法命名,可用 let 或 const 先声明再赋值,保证引用有效:
let factorial;<br> factorial = (n) => n <= 1 ? 1 : n * factorial(n - 1);
这样既避免 arguments.callee,又保持函数表达式灵活性。
立即学习“Java免费学习笔记(深入)”;


















