鉴于我的插件可以在任何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
,this
或call()
等来调整apply()
。
bind()
我觉得这是重复的,但我找不到我第一次看到的地方。
答案 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 )