检查它是否是窗口对象

时间:2013-07-09 08:05:37

标签: javascript

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

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

    就像我如何知道someVar是否引用浏览器window对象一样。 window中有什么内容可以检查它是否真的是浏览器window对象?

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

    假设您无法判断someVar是否window,并且您希望将其与真正的浏览器window对象匹配,例如{{ 1}},你如何得到someVar === window你确定它是浏览器window而不是来自名为window的外部范围的其他对象,或者来自其他环境的其他全局对象?

只是为了澄清一点:

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

我不能做window之类的事情,因为if(!window)可能只是在范围之外的某个地方声明的另一个对象。

window

我无法检查function someFunction(){ var window = {foo:'bar'}; (function(){ console.log(window); //{foo:'bar'} }()); } 因为我也可以自我引用,如前所述,if(window.window === window)可能是来自外部范围的对象:

window

以下内容可能不起作用,因为脚本可以在除全局空间之外的内容中包装或连接。还可以使用var bar = {}; bar.bar = bar; bar.bar.bar.bar.bar.bar === bar; //true thiscall()等来调整apply()

bind()

我觉得这是重复的,但我找不到我第一次看到的地方。

6 个答案:

答案 0 :(得分:3)

你可以像这样得到全局对象......

var global = (1,eval)("this");

答案 1 :(得分:3)

这不仅会测试当前窗口,而且会测试窗口:

window.toString() == "[object Window]";

答案 2 :(得分:1)

怎么样

function isWindow() {
    _test = 42;
    return window && window._test == 42
}

答案 3 :(得分:0)

如果使用对象窗口支持的某些方法,则可以检查它。 例如postMessage:

(function(o){ 
 if(!!o.postMessage) console.log("This is my window"); 
 else console.log("This isn't my window");
})(window);  

答案 4 :(得分:0)

我在了解通过

创建实例时发现了它
var MyExampleInstace = function MyExampleInstace() {
    console.log(this); // returns undefined in strict mode
    // in not strict mode it will return Window 
}

new MyExampleInstace(); // will not return and error (this will be fine)

我想创建一个像

这样的错误
throw new Error('Please use "new" keyword');

当某人试图调用MyExampleInstance时不是作为实例而是像以下那样简单的函数:

MyExampleInstance(); // console should show "Please use "new" keyword

所以最后的结果是:

var MyExampleInstace = function MyExampleInstace() {
    if (this === undefined || this instanceof Window) throw new Error('Please use "new" keyword');
}

要检查对象是某些" kind"的对象。我找到的最简单的方法

// myVar could be "this" or every var u need
// That's also opens the way to check the object instance of your MyExampleInstance
myVar instanceof Window

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/instanceof

答案 5 :(得分:-1)

if( this.window === this )