鉴于我的插件可以在任何 JS 引擎上运行(无论是否在浏览器中),
怎么知道某个变量实际上是浏览器
window
对象。就像我怎么知道是否
someVar
引用了浏览器window
对象。有什么window
我可以检查它是否真的是浏览器window
对象吗?以及如何检查浏览器
window
对象是否确实存在,而不仅仅是window
包含对象的某个变量。假设您无法判断它是否
someVar
单独window
存在,并且您想将其与真实的浏览器window
对象(例如)进行匹配,您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()
。
//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({});
我有一种感觉,这是重复的,但我找不到我第一次看到它的地方。