From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- .../global_objects/function/caller/index.html | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 files/zh-cn/web/javascript/reference/global_objects/function/caller/index.html (limited to 'files/zh-cn/web/javascript/reference/global_objects/function/caller') diff --git a/files/zh-cn/web/javascript/reference/global_objects/function/caller/index.html b/files/zh-cn/web/javascript/reference/global_objects/function/caller/index.html new file mode 100644 index 0000000000..a850d41582 --- /dev/null +++ b/files/zh-cn/web/javascript/reference/global_objects/function/caller/index.html @@ -0,0 +1,69 @@ +--- +title: Function.caller +slug: Web/JavaScript/Reference/Global_Objects/Function/caller +translation_of: Web/JavaScript/Reference/Global_Objects/Function/caller +--- +
{{JSRef("Global_Objects", "Function")}} {{non-standard_header}}
+ +

概述

+ +

返回调用指定函数的函数.

+ +

该属性不是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. 查看检测结果.

-- cgit v1.2.3-54-g00ecf