Function.prototype.caller 是一个非标准、已废弃但浏览器仍兼容的属性,用于获取调用当前函数的那个函数引用。一、基本语法
func.caller
- 类型:函数引用 /
null - 只读:是(访问器属性)
- 生效时机:仅在函数执行期间有效,执行完毕后为
null
二、核心规则
- 普通调用(非严格模式)
- 若函数由全局 / 顶层代码调用:
caller === null - 若由另一个函数调用:
caller指向该调用函数
- 若函数由全局 / 顶层代码调用:
function A() { console.log(A.caller); }
function B() { A(); }B(); // 输出:ƒ B() { A(); }
A(); // 输出:null(全局调用)

严格模式('use strict')
- 访问
caller直接抛TypeError,彻底禁用
'use strict';
function A() { console.log(A.caller); }
function B() { A(); }B(); // Uncaught TypeError: 'caller' is restricted

调用者是严格函数
- 即使当前函数非严格,只要调用者是严格函数,
caller也为null
function A() { console.log(A.caller); }
function B() { 'use strict'; A(); }B(); // 输出:null
三、与 arguments.callee 的区别
func.caller:获取调用当前函数的函数(上层)arguments.callee:获取当前函数本身(自身),ES5 严格模式已移除
四、安全与替代方案
-
为什么不推荐用
caller- 非标准:ES 规范仅定义 “毒丸访问器”(抛错),引擎实现不一致
- 安全风险:可能泄露调用栈,被恶意代码利用
- 调试困难:严格模式 / 异步场景下行为不可靠
-
现代替代:
Error.stack(推荐)
function A() {console.log(new Error().stack); // 直接拿到完整调用栈
}
function B() { A(); }
B();

从输出结果来看,Error.stack的调用关系是从下向上依次调用。
五、总结
caller是历史遗留属性,用于获取调用者函数- 严格模式禁用,非严格模式下仅执行期间有效
- 现代开发应优先用
Error.stack或调试工具,避免依赖caller
