Выбор ответа Junior События обновлено

Почему обработчик не снимается

Вопрос

Почему после этого кода обработчик продолжает срабатывать?

el.addEventListener('click', () => save());
// позже
el.removeEventListener('click', () => save());

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

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

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

Коротко

Правильный ответ: Передана новая функция, а снять можно только ту же ссылку. Каждое () = save() создаёт новую функцию. removeEventListener ищет совпадение по ссылке (и по флагу capture), а такой ссылки среди слушателей нет.

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

  1. removeEventListener работает только с флагом capture: true
  2. Стрелочные функции вообще нельзя снимать
  3. Нужно вызывать removeEventListener до первого клика
  4. Передана новая функция, а снять можно только ту же ссылкуправильный ответ

Разбор

Каждое () => save() создаёт новую функцию. removeEventListener ищет совпадение по ссылке (и по флагу capture), а такой ссылки среди слушателей нет. Решение: сохранить функцию в переменную или использовать AbortController с опцией signal. Ограничения про capture нет, стрелочную функцию из переменной снять можно, момент вызова значения не имеет.

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

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

Термины по теме