self 和 window 和有什么不一样?

IT技术 javascript window
2021-03-01 20:02:43

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

在这个脚本中,我注意到我可以交替使用“window”或“self”,但一切仍然有效。在 HTML 页面中使用时,“window”与“self”是否相同?

4个回答

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

例如,如果你self在一个 Web Worker 内部使用(它存在于它自己的后台线程中),self实际上会引用WorkerGlobalScope.self. 但是,如果你使用self的浏览器中正常情况下,self将简单地返回到基准Window.self(即有一个documentaddEventListener()和所有你看惯了其他的东西)。

TL; DR 而.selfinwindow.self如果window不存在则不存在,单独使用self将指向Window.self传统的窗口/浏览器上下文或WorkerGlobalScope.selfWeb Worker 上下文。

像往常一样,MDN在他们的 JavaScript 文档 中有一篇关于这个主题的精彩文章:)


旁注:self here的用法不应与声明局部变量的常见 JS 模式混淆:var self = this在切换后维护对上下文的引用。

您可以在此处阅读更多相关信息:Getting Out of Binding Situations in JavaScript

来自Javascript:权威指南

Window 对象定义了许多允许您操作 Web 浏览器窗口的属性和方法。它还定义了引用其他重要对象的document属性,例如Document 对象属性。最后,Window 对象有两个自引用属性,windowself. 您可以使用任一全局变量直接引用 Window 对象。

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

除坏死-错误如果FF6.0,stackoverflow.com/a/7769187/139361windowself应该是相同的。任何人都知道任何其他错误?--------------------------------------- 我必须补充一点,使用self对大多数 javascript 开发人员来说是令人困惑的,所以window改用。
2021-04-18 20:02:43

以下是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是等效的。

@Dan,window仅存在于 GUI(浏览器)中。并非所有 Javascript 代码都在浏览器中运行。在这些情况下,self仍然会工作,但window不会。
2021-04-18 20:02:43
@nilskp,这很有趣,但我不明白你的意思。你能解释一下吗?
2021-05-01 20:02:43
对于需要独立于浏览器运行的代码,似乎最好使用self,即无头执行。
2021-05-04 20:02:43
鉴于那window === window.selftrue(至少在 FF 和 Chrome 中),为什么不直接使用window.parent.frames[0] !== window
2021-05-04 20:02:43
@Dan,Rhino(Java 实现)。
2021-05-15 20:02:43

window并且self都指向当前网页的全局对象。

有关更多信息,查看http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific