2016-05-04 2 views
0

Если я подписаться на window.onresize (в приложении с одной страницей), нужно ли отказаться от подписки, чтобы избежать утечки памяти? Если да, то как мне это сделать?Уничтожить событие window.onresize event

<script type="text/javascript"> 
    var heightOutput = document.querySelector('#height'); 
    var widthOutput = document.querySelector('#width'); 

    function resize() { 
    heightOutput.textContent = window.innerHeight; 
    widthOutput.textContent = window.innerWidth; 
    } 

    window.onresize = resize; 
</script> 

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onresize

ответ

1

Чтобы отказаться от подписки, вы можете использовать:

// Subscribe 
window.onresize = resize; 

// Unsubscribe 
window.onresize = null; 

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

В качестве альтернативы, вы можете использовать:

// Subscribe 
window.addEventListener("resize", resize); 

// Unsubscribe 
window.removeEventListener("resize", resize); 

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

Неиспользование подписки на событие не обязательно приведет к утечке памяти. Когда вы, например, создаете <button> с подпиской на событие click, подписка будет удалена после удаления <button> из DOM и не имеет ссылок в коде. (по крайней мере, в современных браузерах)

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

+0

* window.onresize = null * не работает для меня! – coderz

+0

Wether это работает, зависит от того, как вы подключили подписчиков. Если вы использовали 'addEventListener' или jQuery' .resize', 'onresize = null' не будет работать. – user3297291

0

В связи с утечками памяти:

В то время как раньше некоторые тяжелые проблемы с утечками памяти и DOM, насколько мне известно, ни один современный браузер не имеет проблемы с этим больше.

(Раньше это в основном проблема IE.)

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

http://javascript.info/tutorial/memory-leaks

С случае изменения размера, я ожидаю, что вы только собираетесь быть прикрепление его один раз - и есть только один window объект, так что я бы не дать ему второй мысли.

+0

Если в браузере есть приложение с несколькими компонентами, вы можете привязываться к размеру окна из буквально сотен виджетах. Поскольку мы в настоящее время делаем что-то подобное, последнее предложение не имеет никакой ценности комфорта ;-) «Я ожидаю, что вы его только присоедините» Ссылка на утечку памяти мертва – PandaWood

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