为什么窗口与Internet Explorer中的window.self不同?

Jim*_*uls 26 javascript internet-explorer dom cross-browser

有一个复杂的背景故事涉及我是如何遇到这个,但为什么该self属性不完全等于窗口本身?

在Safari和Firefox以及朋友中,结果如我所料:

> window == window.self
  true
> window === window.self
  true
Run Code Online (Sandbox Code Playgroud)

但在Internet Explorer中却不是这样:

>> window == window.self
   true
>> window === window.self
   false
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这种不一致吗?究竟是什么是self窗口对象指向的属性?它投射到平等的东西,这更令人烦恼.

bob*_*nce 16

那还不是全部,window!==window.window!

我相信我们在这里看到的是"内部窗口"和"外部窗口"对象之间的区别.当然其他浏览器也有这些(例如Moz); 它们通常用于呈现window自己代码内部和外部的不同视图.

内部窗口包含全局变量和特定于文档的成员.外窗是通过像窗口引用访问[跨帧- ]脚本frames[n],parent,opener,显然self.它绑定到所有者视口(浏览器窗口/框架),例如.当您将iframe导航到新文档时,父文档仍会window在其iframe中看到相同的标识对象.

在一个明智的浏览器对象模型设计中,会有单独的对象,但是当最初由Netscape抛出JavaScript时,很少考虑优雅,导致这个和许多其他接口有太多的重载(form带有一个名为submit, 任何人?).

因此,为了兼容性,拆分窗口必须继续显示为脚本的单个对象,即使它不在下面.在IE浏览器中,有时掩码会滑落:看起来好像是window在说明内部窗口,并且没有任何黑客可以将它===对准外窗.

ETA:实际上是想到这一点,甚至还有一些(差)理由.ECMAScript规范不是用多个全局上下文编写的,它定义window了未绑定版本this,作为检索全局变量作用域对象,它将是内部窗口.

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

  • @EliGray:ECMA262-3 s10.1.5,ECMA262-5 s15.1:"在HTML文档对象模型中,全局对象的`window`属性是全局对象本身".您可能认为拆分窗口是BS,但这是大多数浏览器所做的,并且如果要维护长期存在的跨框架脚本行为(\*),那么当您将视图导航到新文档时,必须这样做你必须将它的`window`引用到新文档视图的`window`.(\*:IMO:行为不端,但现在尝试改变它是不好的.) (2认同)