Javascript 为什么DOM同时具有窗口和self?
为什么DOM有一个名为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("
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
?”“是的。事实上,全局变量窗口
本身就是全局对象的一个属性,就像我的全局
示例一样。这是因为全局对象(窗口
,在浏览器上)是全局执行上下文的“绑定对象”。