【问题标题】:does this jQuery code snippet cause any memory leak?这个 jQuery 代码片段会导致任何内存泄漏吗?
【发布时间】:2009-03-13 06:35:25
【问题描述】:

我想知道下面的 jquery 代码是否会导致任何内存泄漏:

$( function() {                 
  var parent=$('table#mytable tbody').get(0);
  $('tr:last', parent).click(function(){...});
});

据我了解,$('tr:last', parent) 是最后一行,是 DOM 对象,但在匿名函数中,闭包的作用域是这个 DOM 对象,所以 DOM 和 js 对象之间存在循环引用。

但如果真的有泄漏的话,我可以在曼宁出版的畅销书《jQuery in Action》中看到很多这样的代码。 jQuery 编码中有害的“最佳实践”?

但我不知道我的理解是否正确。我希望你的cmets和更正。谢谢!

【问题讨论】:

    标签: javascript jquery memory-leaks closures


    【解决方案1】:

    此代码将导致 Internet Explorer 6 和 Internet Explorer 7 中的内存泄漏,而不是在其他浏览器中,请参考这些文章 Douglas CrockfordIBM Devloper Site

    【讨论】:

    • 问题是关于 jQuery 的,至少在 2009 年 1 月发布的 jQuery 版本中,此代码不会泄漏。这个答案是错误的。请参阅下面的正确答案。
    【解决方案2】:

    IE 容易泄漏。您可以使用Microsofts javascript memory leak detector 在 IE 中测试您的代码是否存在泄漏。

    Firefox 也可能泄漏。 This article 解释了原因。还有一个用于 Firefox 的 leak detector plugin(尚未测试)。

    【讨论】:

    • 测试了 Firefox 泄漏检测器插件:stackoverflow 显示大量泄漏!
    • 似乎我们的浏览器引擎需要在 Web 2.0 和我们的未来进行改造:-)
    【解决方案3】:

    之前提交的答案(从 3 年前开始,叹气)是错误的。虽然 jQuery 1.0 - 1.2 会在这里泄漏,但查看 jQuery 的版本,当这个问题被问到 http://download.oldapps.com/jquery/jquery-1.3.js 时,以下行包含在添加所有事件侦听器的函数中:

            // Nullify elem to prevent memory leaks in IE
        elem = null;
    

    这是链接文档中的确切防泄漏建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      相关资源
      最近更新 更多