鉴于我的插件可以在任何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'}
}());
}
Run Code Online (Sandbox Code Playgroud)
我无法检查,if(window.window === window)因为我也可以自我引用,如前所述,window可能是来自外部范围的对象:
var bar = {};
bar.bar = bar;
bar.bar.bar.bar.bar.bar === bar; //true
Run Code Online (Sandbox Code Playgroud)
以下可能不起作用,因为脚本可以在除全局空间之外的其他内容中包装或连接.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({});
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,这是重复的,但我找不到我第一次看到它的地方.
| 归档时间: |
|
| 查看次数: |
4999 次 |
| 最近记录: |