【问题标题】:How to create an alias for 'window'?如何为“窗口”创建别名?
【发布时间】:2016-04-04 20:21:08
【问题描述】:

我正在编写一个使用大量全局变量的 javascript 应用程序:

window.x = 0;
window.y = 0;

我希望能够为窗口对象使用别名:

w = window;
w.x = 0;
w.y = 0;

但是,当我将 w 设置为 window 时,它似乎递归地将自身添加到 DOM:

w = window;
// In the DOM Explorer:
> w   page.html
>   w   page.html
>     w   page.html...

这似乎会破坏内存,但应用程序运行良好。有没有更好的方法来创建全局变量或窗口别名?

【问题讨论】:

  • 为什么不在脚本顶部的所有内容之外声明它们,然后您就不需要添加window.?还是您在重用名称和命名空间?
  • window.window.window.window.document.title 是合法的,不会浪费内存...同样,因为w==windoww.w.w.w == window.w.window.w。简而言之:没问题...
  • “它似乎递归地将自身添加到 DOM” - 不是真正的 DOM,严格来说,窗口不是它的一部分;但无论如何,window 是在浏览器中运行的 JS 中最顶层的对象,并且您声明的 每个 全局变量都将成为 window 对象的属性 - 这里的 w 变量也是如此,它的价值是什么has 不参与其中。循环引用,主要是在 JS 变量和实际的 HTML 元素对象之间,曾经是浏览器中的一个问题,IE 结合事件处理有著名的内存漏洞;但是,您在这里所做的不应给任何浏览器造成任何麻烦。
  • 话虽如此,如果您正在编写一个应用程序,您可能想研究如何更好地封装您的代码及其来自“外部世界”的数据; IIFE 是小规模事物的起点。
  • 似乎递归地将其添加到 DOM 的原因是因为您拥有对象引用本身。这不是问题,并且不会比向任何其他对象添加属性消耗更多的内存。在 JavaScript 中,对象是由内存地址引用的。

标签: javascript


【解决方案1】:

当你声明一个没有 var 的变量时,你实际上是在将它分配给 window 对象。

所以,

w = window;

变成

window.w = window

这就是递归行为的原因。

您可以使用IIFE 来实现您想要的。

(function(w) {
   w.x = 0;
   w.y = 0;
})(window)

【讨论】:

  • IIFE 在这里为我们做了什么?
  • 这是一种标准的方式来给全局对象(如 window、jQuery)起别名,而无需添加更多我们自己的对象,如此处的 w。更多关于这个here
【解决方案2】:

你的全局变量不会浪费内存,但你应该避免使用全局变量。

(function() {
  var w = window; // Create local alias
  window.window; // window
  w.w; // undefined (probably)
})();

当然,这假定window 指向全局对象。如果您想获得对全局对象的引用,即使 window 被遮蔽,请参阅 Getting a reference to the global object in an unknown environment in strict mode

【讨论】:

    【解决方案3】:

    在除 IE 之外的所有浏览器中,window.window 只是一种奇怪的引用方式......好吧..window。所以 window === window.window,是的。

    window.window.window也和window.window一样。

    信息http://javascript.info/task/window-windowwindow

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2012-11-15
      • 2016-10-25
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      相关资源
      最近更新 更多