#javascript #ajax #jquery #memory-leaks
#javascript #ajax #jquery #утечки памяти
Вопрос:
Итак, я создаю сложную систему управления проектами, которая полностью построена на AJAX. С помощью хэш-навигации сайт загружает и удаляет много HTML и добавляет много прослушивателей событий при каждой загрузке.
Мой вопрос в том, собирает ли мусор современных браузеров прослушиватели событий после того, как эти элементы были $.remove’d.
Если нет, то лучше ли использовать onclick=»doFunction();» вместо этого, чтобы предотвратить добавление прослушивателей событий? Я бы предпочел не делать это таким образом, но если это предотвратит утечки памяти, это может быть лучшим вариантом.
Любая помощь была бы высоко оценена.
Спасибо!
Ответ №1:
Нет, лучше добавлять прослушиватели событий с помощью jQuery, потому что jQuery имеет дело с возможными утечками памяти.
Комментарии:
1. Я хотел бы верить, что это правда, но я не верю, что это так. С плохо написанным кодом привязки обработчика событий вы все равно могли бы оставлять метрические тонны указателей, даже с jQuery.
2. Я думаю, что Тадек говорит о том, что если вы используете jQuery для привязки обработчиков событий и для удаления элементов из DOM, то jQuery очистит обработчики событий, которые могут вызвать утечки в старых браузерах при удалении элементов.
3. jQuery не очищает все ссылки во всех ситуациях; тем не менее, это, безусловно, помогает!
Ответ №2:
Использование onclick — это неправильный путь. jQuery — отличный вариант, особенно если он окажется полезным во всем вашем приложении. Если вы используете его ТОЛЬКО для Ajax, вы, вероятно, можете найти библиотеки меньшего размера для выполнения этой работы.
Если вы хотите использовать jQuery, я бы настоятельно рекомендовал использовать .on() вместо добавления прослушивателей событий при каждой загрузке. Если вы используете .on() для делегатов (замена устаревшего, но все еще функционирующего .метод delegate()) вам не нужно будет повторно связывать их при каждой загрузке, что практически исключит возможность утечек из-за спагетти привязки / развязывания.