Ray*_*nos 13 javascript internet-explorer
在IE中.
window === top; // false
window === window.window // false
window == top; // true
window == window.window // true
Run Code Online (Sandbox Code Playgroud)
在FF3.6和Chrome稳定版中,这种情况不会发生.
在IE中typeof,.toString,Object.prototype.toString.call都返回相同的两个top&window
这是关系到这个.
谁能告诉我为什么IE不能做严格的平等?
请注意,循环引用不会导致IE和Chrome出现问题.
o = {};
o.o = o;
o === o.o; // true
Run Code Online (Sandbox Code Playgroud)
结果
window.window === window.top; // true
window.window === window.self; // true
Run Code Online (Sandbox Code Playgroud)
所以这window是自己的问题.
for (var i in window) {
if (window.window[i] !== window[i]) {
console.log(i); // external, frames, clipboardData
}
}
Run Code Online (Sandbox Code Playgroud)
[编辑]
这只是现在变得愚蠢:
window.frames === window.frames; // false
window.frames == window.frames; // false
window.external == window.external; // true
window.external === window.external; // false
window.clipboardData === window.clipboardData; // false
window.clipboardData == window.clipboardData; // false
Run Code Online (Sandbox Code Playgroud)
[进一步编辑]
事实证明,window.frames拥有一个指向ie调试器的指针.因此打开调试器会更改window对象.我还要做一些测试.
window.frames.location === window.frames.location; // false
window.frames.location == window.frames.location; // true
window.frames.event.boundElements == window.frames.event.boundElements; // false
Run Code Online (Sandbox Code Playgroud)
更不用说window.external只是不好玩
>>for (var i in window.external) alert(i);
"Object doesn't support this action"
Run Code Online (Sandbox Code Playgroud)
Tim*_*own 13
这不是一个错误:主机对象可以做任何他们喜欢的事情,并且该window对象是一个特别复杂的野兽,服务于作为代表浏览器窗口的对象的双重目的,并且也是全局对象的别名.我将这个作为一个奇怪的白垩,并避免===在比较Window对象时使用严格的运算符.
请注意,这不是"JavaScript很奇怪"的耸肩.除了作为全局对象之外,window还有一个主机对象,并且HTML5之前可以合法地(至少根据规范)表现出它喜欢的行为.较早版本的IE利用了这种自由,并表现出许多古怪的行为,没有任何规范.试图在不访问源代码的情况下理解它是一个毫无意义的练习.
| 归档时间: |
|
| 查看次数: |
4889 次 |
| 最近记录: |