arguments.callee 被废弃,因其破坏函数可预测性、阻碍引擎优化(如tco和内联)、导致this与作用域不一致,严格模式禁止使用,且有具名函数等更安全替代方案。

arguments.callee 被废弃,核心原因是它破坏了函数的可预测性、阻碍了现代 JavaScript 引擎的优化,并与严格模式的设计哲学冲突。
破坏尾调用优化(TCO)和内联优化
引擎在做函数内联或尾调用优化时,需要静态确定函数的调用目标。而 arguments.callee 是一个运行时动态引用——它指向“当前正在执行的函数”,但这个绑定无法在编译/预编译阶段确定,尤其在闭包、递归匿名函数中容易产生歧义。这迫使引擎放弃大量性能优化机会。
导致 this 和作用域行为不一致
在非严格模式下,arguments.callee 的调用会隐式改变 this 绑定(例如在事件回调或间接调用中),且其词法作用域链可能与外层函数不完全对齐。开发者难以准确推断执行上下文,调试困难。
严格模式直接禁止使用
ECMAScript 5 严格模式将 arguments.callee 设为只读属性并抛出 TypeError。这是明确的信号:该特性不再被语言支持。所有主流环境(Chrome、Firefox、Safari、Node.js)在严格模式下均不可用。
有更清晰、安全的替代方案
递归场景下,应使用具名函数表达式或函数声明:
- ✅ const factorial = function fn(n) { return n
- ✅ function fib(n) { return n
- ❌ 不再依赖 arguments.callee 实现匿名递归
需要动态获取当前函数时,显式命名比隐式 callee 更利于阅读、调试和工具分析(如堆栈追踪、代码压缩、IDE 跳转)。











