以下似乎是合理使用__caller__
:
var foo=1;
function a() {
var foo=2;
function b() {
var foo=3;
foo; // 3
this.foo; // 1, from global
__caller__.foo // 2
}
b();
}
a(); // creates a's execution context
但是,__caller__
不可用。为什么不?如果可以使用this
访问全局上下文/变量对象,那么为什么不a
?
答案 0 :(得分:4)
出于安全原因,删除了返回调用者激活对象的特殊属性__caller__,从而允许重建堆栈。
很容易理解为什么这可能是浏览器中的安全灾难,其中大部分UI都是用JavaScript实现的。想象一下,你的一个函数是由附加组件或其他chrome调用的。您可以查找调用堆栈并读取调用者的(可能敏感的)变量,甚至将JavaScript值注入调用函数,可能会破坏它们以根据用户的意愿执行某些操作。实际上,每个网页都会获得Chrome安全权限并完全破坏浏览器。
你当然不应该在真正的JavaScript中使用它,因为它是一个非标准的Mozilla实现细节,更不用说令人难以置信的丑陋了。它没有你通常对JS的词汇行为。
答案 1 :(得分:1)
我对这个问题并不熟悉,但你试过arguments.callee.caller
吗?
答案 2 :(得分:0)
在您的示例中,您可以争辩b
中的内容应该能够解决a
的活动实例中的内容,这似乎是合理的,因为a
包含b
}。但如果情况并非如此,请说明你要定义
function c() {
var foo='hedgehog';
b();
}
这完全不同,所以你的论证看起来适用于一个非常特殊的情况。