2011-07-14 120 views
2

我担心我可能会使用泄漏内存的代码模式。下面是伪代码示例:重命名'this'关键字

window.user = new User(); 

user.getBasicInfo(function(basicInfo){ 

    user.name = basicInfo.name; 

    user.getDetailedInfo(function(detailedInfo){ 

    user.favoriteColor = detailedInfo.favoriteColor; 

    }); 

}); 

换句话说,我不使用'this'关键字来引用用户对象;我直接指的是存储在window对象内的user对象。

很显然,关键字JavaScript 'this'给了很多人很多麻烦。我见过一些人重新命名'this'以使其更清晰,因为他们下降一个作用域链:

window.user = new User(); 

user.getBasicInfo(function(basicInfo){ 

    var userInOuterScope = this;  
    userInOuterScope.name = basicInfo.name; 
    userInOuterScope.getDetailedInfo(function(detailedInfo){ 

    var userInInnerScope = this; 
    userInInnerScope.favoriteColor = detailedInfo.favoriteColor; 

    }); 

}); 

不漂亮,但似乎作用域链可能会在这种情况下,少令人费解。

第一种方法可以泄漏内存吗?第二个可以吗?为了避免内存泄漏,我必须通过所有内容作为参数(并且永远不会引用当前范围之外的对象)?

回答

4

“泄漏记忆”的可能性与您似乎要问的问题无关。也就是说,这两种方法都不影响记忆的使用,至少在我看来没有任何意义。

您可能更愿意在代码中使用this工具的原因是您可能需要一组对象。在你的情况下,你显然使用该对象作为单例,所以它没有任何区别。但是,这真是一个特例,如果你有100个“用户”对象,你很快就会发现它不能很好地工作。

保留的this的值(和它不是真正的“重命名” this;它复制其值插入到另一变量)的封闭件内可以结果在内存泄漏,或者说,可以是一个更大的存储 - 的一部分泄漏设置,但它本身并没有问题。制作对象引用的拷贝是一直发生的事情。

编辑 —的“渗漏”问题瓶盖来什么时候的事情组合发生了:

  1. 某些对象通过在封闭范围内的变量(不奇怪或本身有害)引用;
  2. 通过返回或通过全局状态副作用(如注册一个事件处理程序)导出函数调用来引用函数调用中的闭包范围“转义”的函数(本身也不奇怪或有害) ;
  3. 这些导出函数的人口增长,自己分配更多的空间他们调用时并保存到在封闭分配的空间引用功能,导出的函数最终被DOM节点直接引用(这在IE中是一个特别的问题)。

真的,JavaScript没有任何内存泄漏的问题,任何具有真正闭包的语言都有。对于这个世界中大量实际的JavaScript软件(连接到网页的实用程序代码),内存泄漏是一个问题非常罕见,我怀疑,虽然DOM参考的IE问题可能会在几年内崩溃一些浏览器这可能不会让不幸的用户感到惊讶)。

我不喜欢推动框架的人,但它肯定是真的,框架作者必须担心这个东西。通过确保只通过框架设施将事件处理程序和数据附加到DOM,相信您的框架能够保持DOM清洁,因此是一个好主意。

+0

谢谢,尖尖 - 我想我不确定何时在函数体内释放(或不释放)变量的引用。如果引用是通过“参数”对象传递的,我想在执行正文时很容易释放它。我担心,如果我通过循环访问'arguments'对象来引用变量,那么引用可能会持续存在,从而将函数体保留在内存中。 – marclar

+0

我会用更多的信息更新答案。 – Pointy

+0

感谢编辑,Pointy。我的大部分代码都是不显眼的,但是我有*一些内联JS,我会寻找迁移到jQuery.live处理程序。 – marclar

0

JavaScript的这是不一样的这就像Java或C#的。它表示当前正在执行的内容的上下文。

1

它似乎没有在您的代码中有任何循环引用,所以我不会担心内存泄漏。据我所知,您不会将对象设置为等于其他对象(http://jsfiddle.net/Akkuma/UTL3B/作为它可能导致内存泄漏的简单示例)。

以下是内存的几个引用泄漏

此外,还可以使用Chrome的堆快照工具,能告诉与否你有内存泄漏值得担心。

+0

谢谢,Akkuna - 我之前看过其他文章,但javascriptkit对我来说是新的,对我非常有帮助。 – marclar