JavaScript - 检查是否在全局范围内

时间:2008-12-20 10:42:40

标签: javascript object global

当一个函数附加到一个对象并被调用时:

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(); }

注意:我在这里没有特别的用例 - 我实际上是在询问这个确切的机制。

3 个答案:

答案 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===,因为解释器可以更完整地优化此类访问。