考虑到我的插件可以在任何JS引擎上运行(无论是在浏览器中还是不在浏览器中),
如何知道某个变量实际上是浏览器
window
对象。就像我如何知道
someVar
是否引用了浏览器的window
对象。在window
中有什么东西可以检查它是否真的是浏览器的window
对象吗?如何检查浏览器的
window
对象是否真的存在,而不仅仅是包含一个对象的window
变量。假设您无法单独判断
someVar
是否是window
,并且想将其与实际的浏览器window
对象进行匹配,例如someVar === 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()”的调用进行修改。
//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({});
我有一种感觉这是一个重复的问题,但我找不到我第一次看到它的地方。
thisArg
不会更改为全局对象。例如,这将返回null:(function () { "use strict"; return (function(){return this}).call(null); })()
。 - Andy EthisArg
呢?是否可以使用类似的方法? - John Dvorakwindow
是否为浏览器的window
对象,而不是命名为window
的其他对象。 - Joseph