Этот вопрос проверяет понимание механизма работы addEventListener и removeEventListener в JavaScript, а также типичных ошибок, которые приводят к неудачному удалению обработчиков событий.
Метод removeEventListener предназначен для удаления обработчика события, ранее зарегистрированного с помощью addEventListener. Для успешного удаления необходимо, чтобы все параметры вызова removeEventListener точно совпадали с параметрами первоначального вызова addEventListener.
removeEventListener не найдёт совпадения.addEventListener может быть объектом опций или булевым значением useCapture, указывающим фазу (захват или всплытие). Если при удалении этот параметр не совпадает, обработчик не будет удалён.{ once: true }), то при удалении нужно передать тот же объект или эквивалентное булево значение для capture..bind() создаётся новая функция. Удалить нужно именно связанную функцию, а не оригинал.Рассмотрим типичную ошибку с анонимной функцией:
// Неправильно: обработчик не будет удалён
element.addEventListener('click', function() {
console.log('Clicked!');
});
element.removeEventListener('click', function() {
console.log('Clicked!');
}); // Это две РАЗНЫЕ функцииПравильный подход — использовать именованную функцию:
// Правильно: обработчик успешно удаляется
function handleClick() {
console.log('Clicked!');
}
element.addEventListener('click', handleClick);
// ... позже
element.removeEventListener('click', handleClick);Пример с фазой события (useCapture):
function handler() { /* ... */ }
// Добавляем на фазе захвата (третий параметр true)
element.addEventListener('click', handler, true);
// Эта попытка удаления не сработает, так как useCapture не указан (по умолчанию false)
element.removeEventListener('click', handler);
// А это сработает:
element.removeEventListener('click', handler, true);Корректное удаление обработчиков критично для предотвращения утечек памяти в долгоживущих приложениях (например, SPA на React), а также для управления поведением динамических интерфейсов, где элементы могут многократно создаваться и уничтожаться.
Вывод: Всегда сохраняйте ссылку на функцию-обработчик, если планируете её удалять, и следите за точным совпадением всех параметров при вызове addEventListener и removeEventListener.