有一个复杂的背景故事涉及我如何遇到这个,但为什么self
属性不完全等于窗口本身?
在Safari和Firefox以及朋友中,结果如我所料:
> window == window.self
true
> window === window.self
true
但在Internet Explorer中却不是这样:
>> window == window.self
true
>> window === window.self
false
任何人都可以说明不一致吗?究竟是什么是窗口对象指向的self
属性?它投射到平等的东西,这更令人烦恼。
答案 0 :(得分:15)
这不是全部,window!==window.window
!
我相信我们在这里看到的是“内部窗口”和“外部窗口”对象之间的区别。当然其他浏览器也有这些(例如Moz);它们通常用于从自己代码的内部和外部呈现window
的不同视图。
内部窗口包含全局变量和特定于文档的成员。外部窗口可通过[{1}},frames[n]
,parent
和显然opener
等窗口引用访问[cross-frame-]脚本。它绑定到所有者视口(浏览器窗口/框架),例如。当您将iframe导航到新文档时,父文档仍会在其iframe中看到同一个身份self
对象。
在一个合理的浏览器对象模型设计中,会有单独的对象,但是当最初由Netscape抛出JavaScript时,很少考虑优雅,导致这个和许多其他接口存在过多的重载({ {1}}有一个名为window
的元素,有人吗?)。
因此,为了兼容性,拆分窗口必须继续显示作为脚本的单个对象,即使它不在下面。在IE浏览器中,有时掩码会滑落:似乎说form
会让你看到内部窗口,并且没有任何黑客可以使它submit
对着外窗。
ETA:实际上要想到这一点,甚至还有一些(差)理由。 ECMAScript规范不是用多个全局上下文编写的,它定义window
和===
的未绑定版本,作为检索全局变量范围对象,它将是内部窗口。
作为DOM / BOM一部分的其他属性不在ECMA规范的范围内,因此它们可以返回不同的东西(并且必须为了跨框架脚本)。
答案 1 :(得分:4)
好问题。它也是document
和document.parentWindow
:
window == document; // true
window === document; // false
window == document.parentWindow; // true
window === document.parentWindow; // false
对我而言,最重要的是:
window == document; // true
document == window; // false
您可以在上述任何示例(并保留在全局范围内)中将window
替换为this
,并获得相同的结果。它使==
运营商更加怀疑。
为什么它的表现方式超出了我的范围。