Выбор ответа Middle Память и сборка мусора обновлено

Снять все слушатели одним вызовом

Вопрос

Компонент вешает пять слушателей на window и document. Как проще всего гарантированно снять их все при уничтожении?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Передать всем addEventListener { signal } и вызвать controller.abort(). addEventListener принимает signal от AbortController, и при abort() все такие слушатели снимаются разом.

Варианты ответа

  1. Вызвать window.removeEventListener('*') и то же самое для document
  2. Присвоить window.onresize = null и document.onclick = null
  3. Передать всем addEventListener { signal } и вызвать controller.abort()правильный ответ
  4. Ничего не делать: слушатели снимаются сами, когда компонент удалён из DOM

Разбор

addEventListener принимает signal от AbortController, и при abort() все такие слушатели снимаются разом. Не нужно хранить ссылки на функции для removeEventListener. Удалить все слушатели по маске нельзя, такого API нет. onresize = null снимает только обработчик-свойство, а не добавленные через addEventListener. Слушатели на window и document живут, пока живут эти объекты, то есть всю жизнь страницы, удаление компонента их не трогает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.