【问题标题】:JavaScript - check if in global contextJavaScript - 检查是否在全局上下文中
【发布时间】:2010-09-27 20:17:31
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript object global


    【解决方案1】:

    全局对象其实就是窗口所以你可以这样做

    if (this === window)
    

    【讨论】:

    • 如果脚本在浏览器中运行至少是正确的(因为 javascript 现在可以在其他地方运行,这可能不是普遍的真理)
    • 这是跨浏览器的标准吗?
    • 这取决于JavaScript引擎的浏览器实现,但大多数情况下都是这样。
    • Windows 上的 FF、IE、Opera 和 Chrome 都是如此。更多信息:quirksmode.org/js/this.html
    • "Objects and this", "在一个简单的函数调用中,this被设置为全局对象(又名窗口),这不是很有用。", javascript.crockford.com/survey.html
    【解决方案2】:

    RoBorg 的回答在概念上是正确的——除了 window 仅在浏览器主线程的上下文中可用(因此这必然排除工作线程等,以及任何非浏览器托管的 JS,它越来越少并且不太常见)。

    您最安全的选择基本上就是上面的内容,但您应该使用var===,因为解释器可以更全面地优化此类访问。

    【讨论】:

      【解决方案3】:

      以下应该可以工作,因为使用具有 null 值的 Function.call 将在全局范围内调用它。

      this === ((function () { return this; }).call(null))
      

      一个更简单的变体,

      this === (function () { return this; })()
      

      也可以,但我认为第一个使意图更清晰。

      【讨论】:

      • 标签未指定这是否是仅浏览器的问题,并且此答案适用于 node.js 和浏览器
      最近更新 更多