如何为“window”创建别名?

3

我正在编写一个使用很多全局变量的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...

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


1
为什么不在脚本顶部声明它们,这样就不需要添加 window. 了呢?或者你是在重复使用名称和命名空间吗? - StudioTime
2
window.window.window.window.document.title 是合法的,不会浪费 RAM...同样地,由于 w==window,所以 w.w.w.w == window.w.window.w。简而言之:没有问题... - dandavis
1
似乎它会递归地将自己添加到DOM中 - 严格来说,不是DOM的一部分,窗口并不是它的一部分;但无论如何,在浏览器中运行的JS中,窗口是最顶层的对象,并且您声明的每个全局变量都成为窗口对象的属性 - 您在这里声明的w变量也是如此,它的值对此没有任何影响。在浏览器中,循环引用主要发生在JS变量和实际HTML元素对象之间,IE与事件处理相结合会导致著名的内存泄漏问题;然而,您在这里做的事情不应该会给任何浏览器带来麻烦。 - CBroe
话虽如此,如果你正在编写一个应用程序,你可能想要探索更好地封装你的代码和数据,使其与“外部世界”隔离开来;IIFE 是小规模实现这一点的起点。 - CBroe
1
它看起来会递归地将其添加到DOM的原因是你让对象引用自身。这不是问题,不会比将属性添加到任何其他对象消耗更多的内存。在JavaScript中,对象是通过内存地址引用的。 - James
如果开发工具可以以不同的样式呈现与其父级相等的“子对象”,那就太好了。 - dandavis
3个回答

2
无论何时你在声明一个变量时没有使用var关键字,实际上就是将它赋值给了window对象。

因此,

w = window;

变成

window.w = window

这就是为什么需要递归行为。

你可以使用立即执行函数表达式(IIFE)来实现你想要的功能。

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

这里的IIFE对我们有什么作用? - dandavis
这是一种标准的方式,可以为全局对象创建别名,例如window、jQuery之类的,而无需添加我们自己的变量,例如此处的w。更多信息请参见此处 - Bhabishya Kumar

0

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

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

当然,这假设window指向全局对象。如果您想获取对全局对象的引用,即使window被遮蔽,请参见在严格模式下获取未知环境中全局对象的引用

0
在除了IE浏览器之外的所有浏览器中,window.window只是一种用来引用window对象的方法,也就是说window === window.window,是正确的。
window.window.window也与window.window相同。 信息http://javascript.info/task/window-windowwindow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接