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