避免将jquery选择器作为构造函数参数发送时内存泄漏

Avoid memory leaks sending jquery selectors as constructors parameters

本文关键字:参数 泄漏 内存 构造函数 jquery 选择器      更新时间:2024-04-10

我在不使用MVC框架的情况下构建了一些视图。只有jQuery和JavaScript。我或多或少有,下一个建设:

function LeWildConstructor ($selector) {
   $selector.find('anElement').bind(function () {
     ...
   });
}
$(function () {
  window.wildConstructor = new LeWildConstructor($('.container'));
});

一位软架构师告诉我,如果页面继续打开一段时间,这种结构可能会泄漏。

他建议做一些类似的事情:

function LeWildConstructor () {
   var $selector = $('.container')
   $selector.find('anElement').bind(function () {
     ...
   });
}
$(function () {
  window.wildConstructor = new LeWildConstructor();
});

我认为两种方法都是一样的。

我知道在准备好的文档之后,构造函数调用一次,参数发送一次,而jQuery是懒惰的,一旦我发送了节点元素,每次我在构造函数内部引用$selector时就不再调用了。

但我不确定我是否错过了其他可能导致泄漏的做法。

如果不将其分配给变量,我不明白为什么会有任何泄漏,但请考虑以下代码:

$(function () {
  var something = $('.container');
  window.wildConstructor = new LeWildConstructor();
});

在删除全局变量之前,不会收集此闭包,因此另一种方法确实避免了1个引用被"泄漏"。现在,在任何页面的内存中都有一个额外的jQuery选择器可能没有什么区别,特别是如果只调用几次的话。

我不确定jQuery是如何工作的,但它似乎是一个对象(引用)数组,应该是超轻量级的,以便在内存中浮动。

TL;DR尽管相关,但我认为他的考虑在这个具体案件中是毫无意义和错误的。

经过更多思考后编辑在t.niese注释

之后再次编辑为clarlify