我有一个 JavaScript 来处理检测页面是否在框架中。我使用了 top.frames[] 等,一切正常。
在这个脚本中,我注意到我可以交替使用“window”或“self”,但一切仍然有效。在 HTML 页面中使用时,“window”与“self”是否相同?
我有一个 JavaScript 来处理检测页面是否在框架中。我使用了 top.frames[] 等,一切正常。
在这个脚本中,我注意到我可以交替使用“window”或“self”,但一切仍然有效。在 HTML 页面中使用时,“window”与“self”是否相同?
self
是一个只读属性,可以比window
直接使用更灵活,有时用于支持。这是因为self
的引用根据操作上下文而变化(与 不同window.self
,它仅在window
存在时才存在)。正如其他人提到的那样,它也非常适合进行比较。
例如,如果你self
在一个 Web Worker 内部使用(它存在于它自己的后台线程中),self
实际上会引用WorkerGlobalScope.self
. 但是,如果你使用self
的浏览器中正常情况下,self
将简单地返回到基准Window.self
(即有一个document
,addEventListener()
和所有你看惯了其他的东西)。
TL; DR 而.self
inwindow.self
如果window
不存在则不存在,单独使用self
将指向Window.self
传统的窗口/浏览器上下文或WorkerGlobalScope.self
Web Worker 上下文。
像往常一样,MDN在他们的 JavaScript 文档 中有一篇关于这个主题的精彩文章。:)
旁注:self
here的用法不应与声明局部变量的常见 JS 模式混淆:var self = this
在切换后维护对上下文的引用。
您可以在此处阅读更多相关信息:Getting Out of Binding Situations in JavaScript。
来自Javascript:权威指南:
Window 对象定义了许多允许您操作 Web 浏览器窗口的属性和方法。它还定义了引用其他重要对象的
document
属性,例如Document 对象的属性。最后,Window 对象有两个自引用属性,window
和self
. 您可以使用任一全局变量直接引用 Window 对象。
简而言之,window
和self
都是对Window对象的引用,该对象是客户端javascript的全局对象。
以下是MDN 页面中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
是等效的。
window
并且self
都指向当前网页的全局对象。
有关更多信息,请查看http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific