JS 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. 查看检测结果.

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了