【问题标题】:Javascript Memory Management LeaksJavascript 内存管理泄漏
【发布时间】:2014-04-08 22:46:55
【问题描述】:

目前我正在创建一个 Web 应用程序。用户应该能够整天运行我的应用程序。目前我有一些记忆问题。浏览器似乎崩溃的地方。我使用的是这种结构:

function Module() {
    var _me = this;

    this.init = function(){
        _me.setBindings(); // Using reference from Module instead of this
    }

   // All kind of functions

   this.init();
}

我改为this

所以更复杂的情况是这样的(这实际上是我的代码 atm 的一部分):

$.modules.dynamic_static_webpage.prototype.addRedirect = function (anum, aeditor) {
    $.prompt(
            $.utils.getTranslation("Redirect"),
            $.utils.getTranslation("Geef de URL op waar naar toe geredirect moet worden"),
            $.proxy(function (num, editor, input) {
                this.clearRedirect(editor);
                var val = input.val();

                if (val.indexOf("www") == 0) {
                    val = "http://" + val;
                }

                // Timeout needed, because otherwise the clear is not finished
                setTimeout($.proxy(function (n, e, v) {
                    $.HTMLTexteditorField.setIframeSelectionHTML.call(e, "{CMS-REDIRECT" + n + "_" + v + "}");
                    this.redirectShow(n, v);
                }, this, num, editor, val), 200);
            }, this, anum, aeditor)
       );
};

现在我已经添加了很多$.proxy。这似乎有点奇怪。

我有很多“使用范围外、范围内的变量”。我重写了上面的代码。我看过类似这样的不同网站,但无法弄清楚:

  1. http://www.ibm.com/developerworks/web/library/wa-memleak/
  2. How do JavaScript closures work?

如果这是避免内存泄漏的正确方法,有人可以解释一下吗?还是有更好的解决方案?

【问题讨论】:

    标签: javascript memory-management memory-leaks


    【解决方案1】:

    您的代码中没有任何内容可以向我表明您将遇到内存泄漏问题。然而,更令人担忧的是,您用来避免内存泄漏的代码风格使得很难判断未来是否会出现内存问题。你已经发布了几十行代码;以这种风格编写的包含几千行代码的代码库可能无法正确审计内存泄漏。

    您可以使用的一些内存管理技术:

    • 如果不再需要使用某个对象,请取消对它的引用。垃圾收集器将为您清理对象。
    • 如果您动态调用 addEventListener,请始终调用 removeEventListener,除非您绑定事件的 DOM 节点稍后被销毁。
    • 如果您从函数内引用一个对象,然后在某处引用该函数,您仍然拥有对该对象的引用。避免保留对不再需要的内容的引用。

    遵循这三个准则将使您在处理 JavaScript 的职业生涯中大部分时间都不会遇到任何与内存相关的问题 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2014-03-02
      相关资源
      最近更新 更多