检查它是否是窗口对象

Jos*_*eph 6 javascript

鉴于我的插件可以在任何JS引擎上运行(在浏览器中或不在浏览器中),

  • 如何知道某个变量实际上是浏览器window对象.

    就像我怎么知道是否someVar引用浏览器window对象.有什么东西window,我可以检查它是否真的是浏览器window对象?

  • 以及如何检查浏览器window对象是否确实存在而不仅仅是window包含对象的某个变量.

    假设你不能告诉,如果someVarwindow本身,并且要匹配它的真正的浏览器window对象一样someVar === window,你怎么弄window,你就一定是浏览器window,而不是从外部作用域一些其它物体命名window,或其他一些全球来自另一个环境?

只是为了澄清一点:

  • 我不是在寻找全球环境.我正在寻找window专门的浏览器对象.
  • 我没有检查脚本是否在浏览器上运行.

我不能做一些事情,if(!window)因为window可能只是在范围之外的某个地方宣布的另一个对象.

function someFunction(){
  var window = {foo:'bar'};

  (function(){
    console.log(window); //{foo:'bar'}
  }());
}
Run Code Online (Sandbox Code Playgroud)

我无法检查,if(window.window === window)因为我也可以自我引用,如前所述,window可能是来自外部范围的对象:

var bar = {};
bar.bar = bar;
bar.bar.bar.bar.bar.bar === bar; //true
Run Code Online (Sandbox Code Playgroud)

以下可能不起作用,因为脚本可以在除全局空间之外的其他内容中包装或连接.this也可以用这样的方法调用修改call(),apply()bind().

//Stand-alone, I can assume window is global since "this" is the global in global space
(function(window){
  //window may not be window
}(this));

//But when this happens
someNamespace.someFunction = function(){

  (function(window){
    //window may not be window
  }(this));

}

//or this:
someNamespace.someFunction.call({});
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,这是重复的,但我找不到我第一次看到它的地方.

And*_*Ray -1

if( this.window === this )
Run Code Online (Sandbox Code Playgroud)