2014-03-06 94 views
1

目前我正在创建一个Web应用程序。用户应该能够整天运行我的应用程序。目前我有一些内存问题。浏览器似乎崩溃的地方。我用是这样的结构:Javascript内存管理泄漏

function Module() { 
    var _me = this; 

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

    // All kind of functions 

    this.init(); 
} 

其中我变为this

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

$.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?

有人能解释我,如果这是正确的做法,以避免泄漏MEMOR?还是有更好的解决方案?

回答

1

你的代码中没有任何东西可以告诉我你会遇到内存泄漏问题。然而更值得关注的是,用于避免内存泄漏的代码风格正在使得很难判断是否会出现内存问题。你已经发布了几十行代码;具有用该风格编写的几千行代码的代码库可能无法正确审计内存泄漏。

,你可以使用一些内存管理技术:

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

遵循这三个准则将让你的大部分通过自己的方式与JavaScript的处理没有任何内存相关的问题了职业生涯:)