我有一个JavaScript来处理检测页面是否在帧中。我使用top.frames []等,一切正常。
在这个脚本中,我注意到我可以互换使用“窗口”或“自我”,一切仍然有效。在HTML页面中使用“窗口”是否与“self”相同?
答案 0 :(得分:19)
来自 Javascript:The Definitive Guide :
Window对象定义了许多 允许你的属性和方法 操纵Web浏览器窗口。 它还定义了引用的属性 到其他重要的对象,如 该
document
属性 文档对象。最后,窗口 对象有两个自我指涉 属性window
和self
。您 可以使用全局变量来 直接引用Window对象。
简而言之,window
和self
都是对Window对象的引用,它是客户端javascript的全局对象。
答案 1 :(得分:12)
self
是只读属性,可以比window
更灵活,有时更直接使用self
。这是因为window.self
的引用会根据操作上下文而改变(与window
不同,self
仅在self
存在时才存在)。正如其他人所提到的那样,它也很适合进行比较。
例如,如果您在Web Worker中使用WorkerGlobalScope.self
(它位于自己的后台线程中),self
实际上会引用self
。但是,如果您在普通浏览器上下文中使用Window.self
,则document
只会返回对addEventListener()
的引用(具有.self
,window.self
的引用,所有其他你常常看到的东西。)
TL;虽然如果window
不存在,self
中的Window.self
将不存在,而WorkerGlobalScope.self
本身使用:)
将指向{{ 1}}在传统的窗口/浏览器上下文中,或self
在Web工作者上下文中。
像往常一样,MDN对此主题有很好的写作in their JavaScript docs。 var 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)
window
和self
都引用当前网页的全局对象。
有关详细信息,请查看http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific