Javascript 为什么Windows与Internet Explorer中的window.self不相同?

Javascript 为什么Windows与Internet Explorer中的window.self不相同?,javascript,internet-explorer,dom,cross-browser,Javascript,Internet Explorer,Dom,Cross Browser,有一个复杂的背景故事涉及到我是如何发现这一点的,但是为什么self属性与窗口本身并不完全相等 在Safari、Firefox和friends中,结果如我所料: > window == window.self true > window === window.self true 但在Internet Explorer中,情况并非如此: >> window == window.self true >> window === window.self

有一个复杂的背景故事涉及到我是如何发现这一点的,但是为什么
self
属性与窗口本身并不完全相等

在Safari、Firefox和friends中,结果如我所料:

> window == window.self
  true
> window === window.self
  true
但在Internet Explorer中,情况并非如此:

>> window == window.self
   true
>> window === window.self
   false

有人能解释这种不一致性吗?窗口对象指向的
self
属性到底是什么?它会导致一些具有平等性的东西,这更令人烦恼。

这还不是全部,
window==窗口。窗口

我相信我们在这里看到的可能是“内窗”和“外窗”对象之间的区别。当然,其他浏览器也有这些(例如);它们通常用于从内部和外部显示
窗口的不同视图

内部窗口保存全局变量和特定于文档的成员。外部窗口可通过诸如
frames[n]
parent
opener
,以及显然是
self
等窗口引用进行[cross frame-]脚本编写。它绑定到所有者视口(浏览器窗口/框架),因此,例如,当您将iframe导航到新文档时,父文档仍会在其iframe中看到相同的标识<代码>窗口对象

在一个合理的浏览器对象模型设计中,可能会有单独的对象,但当Netscape最初将JavaScript组合在一起时,很少考虑优雅,导致这个和许多其他界面过载过多(
form
,其中有一个名为
submit
的元素吗?)

因此,为了兼容性,拆分窗口必须继续显示为脚本的单个对象,即使它不在下面。在IE中,有时面具会滑落:它似乎在说,
window
会让你进入内部窗口,而没有黑客会让它对着外部窗口

埃塔:事实上,想想看,这甚至有一些(糟糕的)理由。ECMAScript规范在编写时没有考虑多个全局上下文,它将
窗口
,以及
的未绑定版本定义为检索全局变量范围对象,该对象将是内部窗口


作为DOM/BOM的一部分的其他属性不在ECMA规范的范围内,因此它们可以返回不同的内容(并且必须返回,为了跨帧脚本)。

问得好。它使用
document
document.parentWindow
也可以:

window == document; // true
window === document; // false

window == document.parentWindow; // true
window === document.parentWindow; // false
但对我来说,最大的wtf是:

window == document; // true
document == window; // false
在上述任何示例中,您都可以使用
this
调出
窗口
,以获得相同的结果。这使得操作员更加可疑


我无法理解它为什么会这样。

很有趣,显然它们不是同一种类型。自我等于真正的思想。显然,IE将窗口视为一种特殊类型。因为IE做了所有错事。:-)作为一个评论会更好,因为它不能回答问题。但是不太适合作为一个评论,嗯。它与
文档中的情况有关。parentWindow===window.self
。在我的假设中(如果是血腥的IE,谁能说出真正发生了什么),显式属性如
window.window
parent
self
opener
frame.contentWindow
document.parentWindow
获取外部窗口,而隐式语言层构造的
window
this
为您提供了一个内部窗口。[有趣的非传递性window/document==比较到底发生了什么,不过,我一点也不含糊!]哇,我不确定我是否可以问一个更好的答案。您在哪里以及在哪个ECMAScript规范中看到了
窗口
全局对象的定义?而且,这整个内窗和外窗都是BS。根据DOM,它们都是相同的
AbstractView
s(尽管显然不在IE中)。正如JavaScript尖锐变量所表示的,
window#1={window:#1#}
@EliGray:ECMA262-3 s10.1.5,ECMA262-5 s15.1:“在HTML文档对象模型中,全局对象的
window
属性是全局对象本身”。您可能认为拆分窗口是BS,但这是大多数浏览器所做的,并且如果它们要保持长期存在的跨框架脚本行为(*),则必须这样做:当您将视图导航到新文档时,您对其
窗口的引用现在指向新文档视图的
窗口
。(*:IMO:行为不端,但现在试图改变这一点是没有用的。)