arguments.callee 指向当前正在执行的函数,使匿名函数能通过它实现递归调用;但因可读性差、影响优化且被严格模式禁用,现代开发应避免使用。

在 JavaScript 中,arguments.callee 曾被用来让匿名函数实现自我调用(即递归),但它已被严格模式禁用,且不推荐使用。现代开发应避免依赖它。
为什么 arguments.callee 能“指向当前函数”
arguments.callee 是一个指向正在执行的函数的引用。在匿名函数中,由于没有函数名,无法通过名字调用自己,这时有人曾用它来实现递归:
例如(仅作历史说明,不要在实际项目中使用):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
(function(n) {
if (n <h3>arguments.callee 的问题</h3>
- 在严格模式(
"use strict")下直接报错:TypeError: 'callee' is not allowed - 阻碍引擎优化(如尾调用优化、内联等),影响性能
- 使代码难以调试和阅读,破坏函数的可预测性
- ECMAScript 规范已将其标记为废弃(deprecated)
现代替代方案
有更清晰、安全、兼容性更好的方式实现匿名递归:
- 命名函数表达式:给函数表达式起个名字,该名字只在函数体内可见
(function factorial(n) {
if (n
-
箭头函数 + 变量赋值:先声明变量,再赋值为箭头函数(注意:箭头函数无
arguments,所以必须用命名或变量方式)
const factorial = (n => n
- 使用高阶函数封装:比如用 Y 组合子(学术场景较多,生产环境少见)
总结
不要用 arguments.callee 实现递归。改用命名函数表达式是最直接、最可读、最兼容的解法。它既保持匿名函数的“即时定义”特性,又提供可靠的自引用能力,还完全支持严格模式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










