arguments.callee 在严格模式下被禁用,因破坏封装性、阻碍引擎优化且难以静态分析;es5起明确禁止,应改用命名函数表达式实现递归等需求。

在现代 JavaScript 中,不推荐也不允许在严格模式下访问 arguments.callee。它已被废弃,且在严格模式("use strict")中直接抛出 TypeError。
为什么 arguments.callee 被禁用
它破坏了函数的封装性,阻碍了引擎优化(如尾调用优化、内联),也使代码难以静态分析和调试。ES5 开始明确将其列为“禁止在严格模式下使用”,主流浏览器和 Node.js 均已严格执行。
替代方案:用命名函数表达式代替
如果目的是实现递归(比如匿名函数中调用自身),应改用命名函数表达式:
- 给函数表达式起一个名字,该名字只在函数内部可见
- 通过这个名字实现递归调用,语义清晰且兼容严格模式
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
return n };
其他常见场景及处理方式
如果你原本依赖 arguments.callee 实现某些逻辑,可按需替换:
- 获取当前函数引用 → 直接使用函数名(命名函数)或提前声明变量绑定函数
-
检查调用栈或调试用途 → 改用
new Error().stack或console.trace() -
动态生成/代理函数 → 使用
Function构造器或Proxy,而非依赖callee
验证是否处于严格模式
若不确定环境是否启用严格模式,可临时检测:
function test() {"use strict";
try {
return arguments.callee;
} catch (e) {
return "strict mode: callee not accessible";
}
}
执行后会捕获错误并返回提示信息。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










