2015-02-21 3 views
0

Следующий код считается причиной утечки памяти, так как element поддерживает ссылку на функцию bar и bar сохраняет ссылку на element через закрытие (если я правильно понимаю).Почему этот JavaScript вызывает утечку памяти?

Почему это вызывает утечку памяти? Это вызывает только утечку, когда element является узлом DOM?

function foo(element, a, b) { 
    element.onclick = function bar() { /* uses a and b */ }; 
} 

ответ

1

Этот код вызвал утечку памяти в некоторых старых версиях Internet Explorer. не Internet Explorer 8 внес некоторые изменения в управление памятью, которые смягчены проблема:

https://msdn.microsoft.com/en-us/library/dd361842(v=vs.85).aspx

Как все из затронутых версий Internet Explorer теперь полностью устарели, это уже не проблема, вы должны быть обеспокоены.

+0

Так что эта категория проблем (создание круговых ссылок на объекты) больше не является проблемой? Я предполагаю, что сборщики мусора могут обнаружить «острова» объекта-графа? – Ben

+1

Подробнее о "круговых ссылках на объекты" можно найти здесь: http://javascript.info/tutorial/memory-leaks –

+1

@BenAston Исправить. Технология продвинулась вперед; современные среды выполнения JS могут обнаруживать и собирать круглые ссылки. – duskwuff

4

Это называется закрытие Javascript и является ожидаемой функцией Javascript. Это не утечка памяти в любом современном браузере.

Если элемент DOM, представленный element, удаляется из DOM, тогда обработчик onclick будет собираться мусором, а затем сам сбор будет собираться мусором.

В течение срока службы element переменные a и b будут частью закрытия. Это ожидаемая языковая функция, поскольку они являются частью замыкания, которое создает этот код. Когда и если, element удаляется из DOM, и это сбор мусора, закрытие и его ссылки a и b также будут иметь право на сбор мусора.

Есть несколько старых браузеров, которые не всегда справлялись с этим должным образом, но это, как правило, больше не рассматривается как дизайн для современных браузеров. Кроме того, это только вызвало проблему, если вы запускали такой код снова и снова (каждый раз удаляли элементы DOM), так что достаточно большой объем памяти потреблялся вещами, которые не собирались мусором, когда они должны были быть , Обычно это происходит только в приложениях с одной страницей, в которых много динамических материалов DOM. Но, как я уже говорил с современными браузерами, это уже не проблема, так как сборщик мусора браузера справляется с этой ситуацией сейчас.

+0

Мне сказали, что и обнуление переменной элемента (var var = переменная для элемента ('document.getElementById ('id'). onclick = function() {/ * ... * /};') исправит утечку памяти IE <8'. Были ли действительным способом разбить эту DOM на утечку памяти обработчика? – GitaarLAB

+0

@GitaarLAB - Вы серьезно пытаетесь справиться с утечками памяти в версиях IE до IE 8? Не создавать закрытие в первую очередь, вероятно, лучший способ избежать этого типа проблем в древних браузерах. Вообще не считалось, что сейчас нужно тратить время разработки. – jfriend00

+1

Да.Но это тоже интересно. И мне удается сохранить некоторые устаревшие вещи, которые используют встроенные элементы управления IE. Я также поддерживаю некоторые вещи, требуя обратной совместимости. Но, в конце концов, информация никогда никому не мешала (как будущий посетитель, который задавался вопросом, как они решили проблему «тогда»). – GitaarLAB

Смежные вопросы