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:行为不端,但现在试图改变这一点是没有用的。)