--- title: Function.caller slug: Web/JavaScript/Reference/Global_Objects/Function/caller translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller ---
返回调用指定函数的函数.
该属性不是ECMA-262第3版标准的一部分.不过, SpiderMonkey (Mozilla的JavaScript引擎) (查看{{ Bug("65683") }}), V8 (Chrome的JavaScript引擎) 和 JScript(IE的ECMAScript实现)都已经支持了它.
如果一个函数f
是在全局作用域内被调用的,则f.caller为
null
,相反,如果一个函数是在另外一个函数作用域内被调用的,则f.caller指向调用它的那个函数.
该属性的常用形式arguments.callee.caller
替代了被废弃的 arguments.caller.
注意,在使用递归调用时, 你不能使用此属性来重现出调用栈.请考虑以下代码:
function f(n) { g(n-1) } function g(n) { if(n>0) f(n); else stop() } f(2)
当stop()函数被调用时,调用栈是这样的
:
f(2) -> g(1) -> f(1) -> g(0) -> stop()
由于下面的表达式为 true(只保留函数最后一次被调用时的caller):
stop.caller === g && f.caller === g && g.caller === f
所以如果你尝试在stop()
函数中获取调用栈的话:
var f = stop; var stack = "调用栈:"; while (f) { stack += "\n" + f.name; f = f.caller; }
则上面的代码会进入一个死循环.
有一个特殊属性 __caller__
, 可以返回调用当前函数的函数的活动对象(可以用来重现出整个调用栈), 但由于安全原因的考虑,该属性已被删除.
caller
属性的值下例用来得出一个函数是被谁调用的.
function myFunc() { if (myFunc.caller == null) { return ("该函数在全局作用域内被调用!"); } else return ("调用我的是函数是" + myFunc.caller); }
Function.caller目前被所有主流浏览器支持: Firefox, Safari, Chrome, Opera 和 IE. 查看检测结果.