当一个函数附加到一个对象并被调用时:
function f() { return this.x; }
var o = {x: 20};
o.func = f;
o.func(); //evaluates to 20
this
指的是函数作为方法调用的对象。这相当于做f.call(o)
。
当函数不是作为对象的一部分调用时,this
引用全局对象。如何检查是否从非对象上下文调用函数?是否有任何标准关键字可以访问全局对象?是这样做的唯一方法吗?
globalobj = this;
function f() { if (this == globalobj) doSomething(); }
注意:我在这里没有特别的用例 - 我实际上是在询问这个确切的机制。
答案 0 :(得分:10)
以下内容应该有效,因为使用值为null的Function.call将在全局范围内调用它。
this === ((function () { return this; }).call(null))
更简单的变体,
this === (function () { return this; })()
也会奏效,但我认为第一个意图更清晰。
答案 1 :(得分:8)
全局对象实际上是窗口,所以你可以做
if (this === window)
答案 2 :(得分:1)
RoBorg的答案在概念上是正确的 - 除了window
仅在浏览器主线程的上下文中可用(因此这必然会排除工作线程等,以及任何非浏览器托管的JS,这是变得越来越不常见了。)
您最安全的赌注基本上就是您所拥有的,但您应该使用var
和===
,因为解释器可以更完整地优化此类访问。