Очистка утечки памяти Javascript в window.unload - PullRequest
2 голосов
/ 04 декабря 2008

Клиентское приложение Javascript.

Попытка устранить утечки памяти приводит к уродливому (если не сказать больше) коду.

Я пытаюсь очистить в window.unload вместо того, чтобы испортить весь код, пытаясь их избежать.

Мы используем в основном element.onevent=function(){..}; шаблон, который приводит к закрытию (в основном разыскиваемый) и утечке памяти.

Мы не используем JavaScript-фреймворки.

Есть какие-нибудь идеи о том, как правильно убирать при выходе?

Кто-нибудь делает то же самое или вы пытаетесь избежать их?

Ответы [ 4 ]

2 голосов
/ 11 декабря 2009

Лучшее решение для вас - развернуть свой собственный метод, который управляет обработкой событий. Поэтому при подключении обработчика событий ваш метод может отслеживать все добавленные события. При выгрузке может отменить регистрацию всех обработчиков.

Я знаю, что вы сказали, что не используете библиотеки, но вы можете использовать их код для вдохновения. Ext-js делает это, когда вы используете Ext.EventMgr.addListener.

Вот простой объект EvtMgr, который вы можете использовать, чтобы начать. Это очень упрощенно, я не могу написать все это для вас здесь. Не стесняйтесь задавать вопросы о вещах, которые вам нравятся, и не знаете, как это сделать. Также обратите внимание, что я не буду использовать метод element.onclick, так как вы можете добавить только один обработчик. Я так делаю, потому что ты сказал, что так ты и делаешь.

var EvtMgr = (function(){
  var listenerMap = {};

  // Public interface
  return {
    addListener: function (evtName, node, handler) {
      node["on" + evtName] = handler;
      var eventList = listenerMap[evtName];
      if (!eventList) {
        eventList = listenerMap[evtName] = [];
      }
      eventList.push(node);
    },

    removeAllListeners: function() {
      for (var evtName in listenerMap) {
        var nodeList = listenerMap[evtName];
        for (var i=0, node; node = nodeList[i]; i++) {
          node["on" + evtName] = null;
        }
      }
    }
  }
})();

Кроме того, помните, что обработчики с замыканиями - не единственный способ создавать утечки. См. Мой комментарий к этому вопросу Утечки памяти Javascript после выгрузки веб-страницы

Кроме того, я не понимаю, почему некоторые люди боятся библиотек. JQuery крошечный, Ext Core тоже. Они могут быть опасны, если вы используете их без понимания js. Но если вы обладаете хорошими навыками js, вы экономите много работы, повторно используя их код. Я попадаю под капот ext-js каждый божий день, когда мне нужно понять, как что-то делается. Вот как я дал вам эти несколько строк кода.

Еще одна мысль, о которой следует подумать при управлении утечками памяти, - убедиться, что вы удаляете обработчики при удалении элементов из DOM (node.innerHTML или любым другим способом). Если вы сделаете это, вы должны удалить обработчики с узлов, которые вы удалили из DOM. Есть некоторая работа, чтобы заставить это работать, но это должно быть частью вашей стратегии.

1 голос
/ 04 декабря 2008

Решением для предотвращения утечек памяти с событиями является делегирование. Короче говоря, вы прикрепляете ваш обработчик событий к родительскому объекту, а не к дочерним. Из-за распространения щелчок по дочернему элементу также будет регистрироваться как щелчок по родительскому элементу, вызывая ваш обработчик. Проверяя целевой атрибут события, вы можете решить, что с ним делать.

Поскольку обработчик прикреплен к родителю, вы можете добавлять или удалять дочерние элементы, не беспокоясь об утечках.

Более подробное объяснение можно найти здесь: http://www.robertnyman.com/2008/05/04/event-delegation-with-javascript/

Демо здесь: http://www.robertnyman.com/test/event-delegation/event-delegation.html

0 голосов
/ 04 декабря 2008

Из большинства моих исследований по этому вопросу нет хорошего способа сделать это .. у каждого отдельного браузера есть своя реализация сборки мусора.

Firefox не так уж и плох, но IE6, например, ужасен ... попробуйте создать что-нибудь более 60 объектов, и IE6 станет очень вялым.

Просто одна из тех вещей, которые я пришел принять.

0 голосов
/ 04 декабря 2008

Я не уверен, что вы имеете в виду под очисткой, поскольку JavaScript имеет автоматическое управление памятью. Но в любом случае, как я понимаю, после того, как окно выгружено, освобождается также вся память, связанная с JS. В конце концов - больше нет JS, выполняющихся со страницы после ее выгрузки, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...