Как правильно отсоединить dom-элементы в виджетах jQuery? - PullRequest
1 голос
/ 25 сентября 2010

У меня проблемы с утечкой памяти в JavaScript.

Я использую расширение Leak Memory 0.4.5 для Firefox , которое показывает мне те объекты JavaScript, которые все еще остаются в памяти.

Теперь я не уверен, как правильно отсоединить dom-объект от событий и т. Д.

Например, у меня есть jQuery-виджет с именем dropdownbox. В методе уничтожения я делаю все необходимое для отсоединения обработчиков событий, таких как:

this.box.find('.toggler').unbind();
this.box.remove();
this.box = null;

Эти 3 строки являются обязательными, или можно вызвать только this.box.remove ()?

До сегодняшнего дня я никогда не связывал и не очищал что-то от элементов DOM, потому что думал, что это не имеет значения. Но я столкнулся с проблемой, что после 2 часов разработки на одном сайте мой Firefox потребляет 1 ГБ!

Итак, я прочитал немного утечек памяти при использовании замыканий и т. Д.
Итак, это мой второй вопрос: я очень часто использую крышки, потому что они действительно классные и удобные.
Некоторые люди говорят, что вы не должны использовать затворы для всего. так, например, если у нас есть следующий код:

function foo(param1, param2) {
  var local1, local2;
  $('a').click(function() {
    alert('YEAH');
  });
}

Было бы лучше сделать это так:

funtion foo(param1, param2) {
      var local1, local2;
      $('a').click(clickEvent);
    }
function() {
  alert('YEAH');
}

Или я не так понял?

Ответы [ 2 ]

3 голосов
/ 10 марта 2013

Я знаю, что это старая тема, но вы упомянули закрытия, но приведенные вами примеры не являются замыканиями.Закрытие «происходит», когда функция возвращает внутреннюю функцию .Люди, вероятно, будут искать здесь, потому что этот вопрос находится в верхней части результатов поиска Google по поводу «событий отмены утечек памяти в javascript», и им не следует вводить неверную информацию :) Я знаю, что это не было преднамеренным.для превосходного объяснения замыканий: Как работают замыкания JavaScript?

1 голос
/ 25 сентября 2010

Вы можете просто позвонить:

this.box.remove();
this.box = null;

.remove() также удалит все дочерние элементы и их обработчики событий / данные .Обнуление ссылки, удерживаемой .box на элемент, является последним шагом для полного удаления (ничего не предполагая else он висит на нем).

Для вашего другого примера вторая версиянемного эффективнее, так как обработчик не копируется повсеместно, чем больше этот обработчик, тем больше это меняет дело.

...