鉴于我的插件可以在任何 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({});
我有一种感觉,这是重复的,但我找不到我第一次看到它的地方。