【问题标题】:What's the difference between self and window?自我和窗口有什么区别?
【发布时间】:2011-04-08 00:32:12
【问题描述】:

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

在这个脚本中,我注意到我可以交替使用“window”或“self”,但一切仍然有效。在 HTML 页面中使用“window”和“self”一样吗?

【问题讨论】:

标签: javascript window


【解决方案1】:

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

例如,如果您在 Web Worker(位于其自己的后台线程中)内使用 selfself 实际上将引用 WorkerGlobalScope.self。但是,如果您在普通浏览器上下文中使用selfself 将仅返回对Window.self 的引用(具有documentaddEventListener() 以及您习惯看到的所有其他内容的引用)。

TL;DR 虽然如果window 不存在,window.self 中的.self 将不存在,但在传统窗口/浏览器上下文中单独使用self 将指向Window.self , 或 WorkerGlobalScope.self 在 web worker 上下文中。

像往常一样,MDN 有一篇关于这个主题的精彩文章in their JavaScript docs:)


旁注:此处self 的用法不应与声明局部变量的常见JS 模式混淆:var self = this 以在切换后保持对上下文的引用。 p>

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

【讨论】:

    【解决方案2】:

    来自Javascript:权威指南

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

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

    【讨论】:

    • 如果 FF6.0、stackoverflow.com/a/7769187/139361windowself 应该相同,则除了 necro-bug。任何人都知道任何其他错误? --------------------------------------- 我必须补充一点,使用 self 会让人感到困惑大多数 javascript 开发人员,所以请改用window
    【解决方案3】:

    这是来自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 进行测试是等效的。

    【讨论】:

    • 对于需要独立于浏览器运行的代码,使用self似乎更好,即无头执行。
    • @nilskp,这很有趣,但我不明白你的意思。你能解释一下吗?
    • @Dan, window 仅存在于 GUI(浏览器)中。并非所有 Javascript 代码都在浏览器中运行。在这些情况下,self 仍然有效,但 window 无效。
    • @Dan,Rhino(Java 实现)。
    • 鉴于 window === window.selftrue(至少在 FF 和 Chrome 中),为什么不直接使用 window.parent.frames[0] !== window
    【解决方案4】:

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

    欲了解更多信息,请查看http://www.howtocreate.co.uk/tutorials/javascript/browserinspecific

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多