【问题标题】:Should I use self or window to reference the global scope?我应该使用 self 还是 window 来引用全局范围?
【发布时间】:2012-06-25 02:20:37
【问题描述】:

作为一种风格约定,当我在全局范围内访问变量时,我喜欢明确,更喜欢

window.example = "Hello";
window.alert(window.example);

不那么冗长

example = "Hello";
alert(example);

我现在有一个可以直接从浏览器使用的模块,或者,如果它们可用,可以从网络工作者那里使用。在 Web Workers 中,全局对象称为 self,而在浏览器中称为 window

window 对象有一个 self 属性,所以 self.example = "Hello" 可以在这两种情况下工作,只要没有人重新声明 self(就像他们经常做的那样:var self = this)。

最好的约定是什么?

  • 使用 self 并希望没有人声明冲突的 self
  • 如果定义了window,则使用window,否则使用self
  • 还有别的吗?

想了想,还是倾向于第二个。

【问题讨论】:

    标签: javascript coding-style web-worker


    【解决方案1】:

    我建议

    var global; try { global = window } catch(e) { global = self }
    

    【讨论】:

    • 令人惊讶的是,当在 web worker 中使用时,这似乎会引发参考错误。 Chrome 说:“ReferenceError:找不到变量:窗口”。我应该提到我正在使用 requireJS 从我的工作人员加载这个模块,所以我想这可能是一些奇怪的根源。
    • 抱歉,我忘记了对不存在的变量的苛刻处理。修好了。
    • global = typeof window !== "undefined" && window !== null ? window : self; 似乎也可以正常工作。不过,我确实喜欢@Pointy 的回答。
    【解决方案2】:

    您可以创建自己的对 window 或 self 的引用:

    var my_window = window || self;
    

    【讨论】:

    • 但是,在 webworker 中,全局上下文不是窗口,因此调用全局上下文 my_window 似乎具有误导性。
    • 开发者显然可以随意命名他的变量
    【解决方案3】:

    在全局范围内,无论是在页面中还是在 web worker 中,您都可以编写如下代码:

    (function( global ) {
      // ... whatever
    }( this );
    

    然后在那个主要的外部函数中,你可以使用“global”(或称它为“window”或“self”或“whatever”),它可以在任一上下文中工作(或在 Node.js 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 2014-04-27
      • 2013-11-06
      • 2022-01-21
      • 1970-01-01
      • 2011-10-20
      • 2021-12-03
      相关资源
      最近更新 更多