Выбор ответа Junior События обновлено
Почему обработчик не снимается
Вопрос
Почему после этого кода обработчик продолжает срабатывать?
el.addEventListener('click', () => save());
// позже
el.removeEventListener('click', () => save());
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Передана новая функция, а снять можно только ту же ссылку. Каждое () = save() создаёт новую функцию. removeEventListener ищет совпадение по ссылке (и по флагу capture), а такой ссылки среди слушателей нет.
Варианты ответа
removeEventListenerработает только с флагомcapture: true- Стрелочные функции вообще нельзя снимать
- Нужно вызывать
removeEventListenerдо первого клика - Передана новая функция, а снять можно только ту же ссылкуправильный ответ
Разбор
Каждое () => save() создаёт новую функцию. removeEventListener ищет совпадение по ссылке (и по флагу capture), а такой ссылки среди слушателей нет. Решение: сохранить функцию в переменную или использовать AbortController с опцией signal. Ограничения про capture нет, стрелочную функцию из переменной снять можно, момент вызова значения не имеет.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
preventDefault не останавливает всплытие
Следующий вопрос
Делегирование: плюсы и подводные камни