自我与窗户有什么区别?

时间:2010-09-03 19:21:14

标签: javascript window

我有一个JavaScript来处理检测页面是否在帧中。我使用top.frames []等,一切正常。

在这个脚本中,我注意到我可以互换使用“窗口”或“自我”,一切仍然有效。在HTML页面中使用“窗口”是否与“self”相同?

4 个答案:

答案 0 :(得分:19)

来自 Javascript:The Definitive Guide

  

Window对象定义了许多   允许你的属性和方法   操纵Web浏览器窗口。   它还定义了引用的属性   到其他重要的对象,如   该document属性   文档对象。最后,窗口   对象有两个自我指涉   属性windowself。您   可以使用全局变量来   直接引用Window对象。

简而言之,windowself都是对Window对象的引用,它是客户端javascript的全局对象。

答案 1 :(得分:12)

self只读属性,可以比window更灵活,有时更直接使用self。这是因为window.self的引用会根据操作上下文而改变(与window不同,self仅在self存在时才存在)。正如其他人所提到的那样,它也很适合进行比较。

例如,如果您在Web Worker中使用WorkerGlobalScope.self(它位于自己的后台线程中),self实际上会引用self。但是,如果您在普通浏览器上下文中使用Window.self,则document只会返回对addEventListener()的引用(具有.selfwindow.self的引用,所有其他你常常看到的东西。)

TL;虽然如果window不存在,self中的Window.self将不存在,而WorkerGlobalScope.self本身使用:)将指向{{ 1}}在传统的窗口/浏览器上下文中,或self在Web工作者上下文中。

像往常一样,MDN对此主题有很好的写作in their JavaScript docsvar self = this

旁注:此处def split(array): newArray = [] if len(array[0]) == 2: return array for i in range(len(array)): newArray.append(array[i][:len(array[i])//2]) newArray.append(array[i][len(array[i])//2:]) return split(newArray) # return this array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(split([array])) >>> [[1, 2], [3, 4, 5], [6, 7], [8, 9, 10]] 的使用不应与声明局部变量的常见JS模式混淆:Attempt to load executable of a type that cannot be dynamically loaded for CFBundle 以保持对上下文的引用切换。

您可以在此处详细了解:Getting Out of Binding Situations in JavaScript

答案 2 :(得分:11)

以下是the MDN page for window.self的解释和示例:

if (window.parent.frames[0] != window.self) {
   // this window is not the first frame in the list
}
  

window.self 几乎总是在比较中使用,如上例所示,它会查明当前窗口是否是父框架集中的第一个子框架。

鉴于目前没有人使用框架集,我认为可以认为self没有用处。此外,至少在Firefox中,针对window而不是window.self的测试是等效的。

答案 3 :(得分:4)

windowself都引用当前网页的全局对象。

有关详细信息,请查看http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific