严格模式下function.caller和arguments.caller被完全禁用,访问即抛typeerror;需在脚本顶部或函数首行加'use strict'启用;调试应使用开发者工具call stack或error.stack替代。

JavaScript 严格模式本身就会自动禁止在任何地方使用 caller,不需要额外操作——只要启用了严格模式,function.caller(包括 arguments.caller)就不可访问,访问时直接抛出 TypeError。
caller 在严格模式下被完全禁用
严格模式将 caller 视为不安全、易导致混淆的遗留特性,因此无论它出现在函数内部还是外部,只要代码处于严格模式作用域,尝试读取或赋值 caller 都会失败。
-
function foo() {}的foo.caller在严格模式下访问 → 报错TypeError: 'caller' is not accessible(具体提示因引擎而异) -
function bar() { return arguments.caller; }在严格模式函数中 → 执行时立即抛出TypeError - 即使
caller出现在全局作用域(非函数内),只要脚本整体启用严格模式,也无例外
确保严格模式生效是关键
caller 被禁用的前提是代码确实在严格模式下运行。必须满足位置和语法要求:
- 全局启用:在脚本最顶部(前面不能有可执行语句)写
'use strict';或"use strict"; - 函数级启用:在函数体第一行写
'use strict';,该函数及其内部所有嵌套函数都受约束 - 注意:注释、空行、分号可以出现在
use strict前,但console.log()、变量声明等执行语句不行
替代 caller 的合理做法
caller 原本用于追溯调用栈,但现代开发中应避免依赖它:
- 调试时用浏览器开发者工具的 Call Stack 面板,清晰可靠
- 需要运行时调用信息时,可用
new Error().stack获取堆栈字符串(非标准但广泛支持) - 设计上尽量减少对调用者身份的硬依赖,改用参数传递或显式上下文对象
不需要特别“禁止”,只要启用严格模式,caller 就自然失效。它的移除是严格模式的内置行为,不是靠检测或拦截实现的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











