Почему нужно отписываться от обработчика событий в JavaScript

Ответ

Отписка от обработчиков событий предотвращает утечки памяти и неожиданное поведение, особенно в SPA. Если элемент удаляется из DOM, но обработчик остаётся подписанным, сборщик мусора не сможет его удалить, так как ссылка на элемент сохраняется в обработчике. Также могут срабатывать обработчики у удалённых элементов.

Пример с отпиской:

const button = document.getElementById('btn');
const handleClick = () => console.log('Clicked!');

button.addEventListener('click', handleClick);

// Позже, когда кнопка больше не нужна
button.removeEventListener('click', handleClick);

В React используйте useEffect с функцией очистки:

useEffect(() => {
  const handleResize = () => console.log('Resized');
  window.addEventListener('resize', handleResize);

  return () => window.removeEventListener('resize', handleResize);
}, []);

Ответ 18+ 🔞

Слушай, а вот этот твой код, он же как собака без поводка — убежит и хуй поймаешь! Речь про обработчики событий, если что. Представь: ты навесил кучу слушателей на кнопки, дивы, окна — а потом взял и удалил элемент из DOM. А слушатель-то остался! Он там в памяти болтается, как хуй в проруби, и ждёт своего часа.

И знаешь, что самое пиздатое? Сборщик мусора на него смотрит и такой: «Ну ты же ещё на что-то ссылаешься, мудила, я тебя удалить не могу!». Вот и получается утечка памяти, овердохуища мусора, а потом приложение тормозит, как пьяный ёжик.

А ещё веселее, когда этот удалённый элемент вдруг начинает откликаться на события — вот тут вообще пиздец, волнение ебать, отладка на три дня. Кто ж его знал, что этот чёртов обработчик ещё жив!

Вот смотри, как надо делать по-человечески. Допустим, ты навесил клик на кнопку:

const button = document.getElementById('btn');
const handleClick = () => console.log('Clicked!');

button.addEventListener('click', handleClick);

// Позже, когда кнопка больше не нужна
button.removeEventListener('click', handleClick);

Видишь? Удалил кнопку из DOM — отписался от события. Всё, чисто, прибрался, как шведский стол после банкета.

А в React, блядь, вообще красота — там useEffect с функцией очистки. Это как взять и после вечеринки не просто уйти, а ещё и мусор за собой вынести. Вот, полюбуйся:

useEffect(() => {
  const handleResize = () => console.log('Resized');
  window.addEventListener('resize', handleResize);

  return () => window.removeEventListener('resize', handleResize);
}, []);

Сделал подписку — сразу продумай, где отписаться. Возвращаешь функцию очистки, и React сам её вызовет, когда компонент будет сносить. Красота, ёпта! Никаких призрачных кликов, никаких утечек. Чистота и порядок, как в аптеке, блядь.

А то ведь бывает — накопишь таких забытых обработчиков, а потом сидишь и думаешь: «И откуда у меня память жрёт, как не в себя?». А это они, суки, сидят и тихо сосут ресурсы. Так что, дружок, не будь мудаком — всегда отписывайся!