Javascript 为什么DOM同时具有窗口和self?

Javascript 为什么DOM同时具有窗口和self?,javascript,dom,Javascript,Dom,为什么DOM有一个名为self的对象和另一个名为window的对象,而它们是相同的东西?要添加到混淆的窗口有一个名为self的属性,因此: window === window.self === self 为什么是这样?我应该使用哪一个?当您调用self时,它是window.self,因此与任何其他全局属性一样(例如location实际上是window.location) 它在那里的原因是什么?通常用于此类支票: if(window.top != window.self) { alert("

为什么DOM有一个名为
self
的对象和另一个名为
window
的对象,而它们是相同的东西?要添加到混淆的
窗口
有一个名为
self
的属性,因此:

window === window.self === self

为什么是这样?我应该使用哪一个?

当您调用
self
时,它
window.self
,因此与任何其他全局属性一样(例如
location
实际上是
window.location

它在那里的原因是什么?通常用于此类支票:

if(window.top != window.self) {
  alert("We're in a frame");
}

全局
self
窗口的快捷方式。self
。它们都是同一个物体

至于为什么既有
window
又有
self
,在网页上下文中,
self
总是等于
window
(据我所知)。但我想这并不一定总是这样-Javascript/ECMAScript不限于在有DOM的网页中使用


至于使用什么,两者都应该可以安全地在正常的网页上下文中使用。请参阅@Nick的评论,了解使用
window
的良好参数。

self
由javascript环境定义,并指向[global]对象(但不属于规范的一部分,因此可能不在那里),而
window
是DOM规范的一部分。 在大多数浏览器中,
窗口
用作[global]对象,但情况并非总是如此

self==window.self
并不奇怪,因为它们是同一个对象-当查找
self
时,它被发现是全局对象(
window
)的一个属性。因此,它实际上与
window.self==window.self
相同


如其他地方所述,要可靠地引用
[global]
对象,您应该通过运行
var global=this将其定义为您的sef在全局执行上下文中。

为什么需要引用其中一个
window
是DOM的一部分,而
self
与javascript中的全局对象相关,在大多数实现中,全局对象恰好与DOM的window相同。在Rhino等非浏览器实现中,存在
self
,但不存在
window
,因为没有DOM。@Sean:
self
不出现在Javascript(ECMAScript)标准中。要跨实现可靠地按名称访问全局对象,您必须自己给它命名,方法是在全局上下文中执行类似的操作(在任何函数之外):
var global=this之所以有效,是因为当控件输入全局上下文的代码时,
指向全局对象
self
作为
窗口外全局对象的名称没有任何意义。self
上下文IMHO。@t.J正要添加same@T.J.如果
window.top
window.self
更改了类型,您的JS中有更大的问题:)作为第一次检查,是的,您可以使用
window
,但是
window.self!=window.top
更清晰了,这是我的观点:)明白了。(和类型:是的,但嘿,它可能发生!
window.top=“frog”
;-)@T.J.哦,它肯定会发生:)旧版IE允许你重新定义
窗口
对象本身,好时机我个人不会使用
self
。许多框架/杂项代码在内部以及可能在您输入的闭包中使用它作为局部变量,因此在某些情况下,
self
可能不是
window.self
。我知道两者都是指向同一对象的指针。DOM对象本身就是一个属性,这让我觉得很奇怪,因为不清楚为什么有人会故意设计这样的东西。如果您知道执行上下文是在ECMAScript中构建的,这一点也不奇怪。毕竟,
self
属性必须定义在可访问的地方,对吗?这是
[global]
对象本身的一个属性。属性实际上指向
[global]
对象在这里并不是真正相关的在全局执行上下文中?我想我的问题是:如果浏览器给我们提供了
window
,为什么
self
存在?等等,这是因为这里使用的
self
是一个全局变量,所有全局变量都是全局JavaScript对象的属性,浏览器也称之为
window
“等待是因为这里使用的
self
是一个全局变量,并且所有全局变量都是全局JavaScript对象的属性,浏览器也称为
window
?”“是的。事实上,全局变量
窗口
本身就是全局对象的一个属性,就像我的
全局
示例一样。这是因为全局对象(
窗口
,在浏览器上)是全局执行上下文的“绑定对象”。