Skip to main content

Анонімна функція як обробник

Короткий відповідь:

Неможливо видалити обробник події, якщо він був оголошений як анонімна функція.

Але давай розберемось чому і що з цим робити.

1. Чому не можна видалити анонімний обробник

Метод removeEventListener() вимагає точно ту саму функцію, яка була передана в addEventListener().

Приклад:

javascript
button.addEventListener('click', () => console.log('hi')); button.removeEventListener('click', () => console.log('hi')); // не спрацює

Щоразу, коли ти пишеш () => ..., у пам'яті створюється нова функція. Браузер не може зрозуміти, що це "та сама" функція, тому не видаляє обробник.

2. Правильний спосіб - винести функцію в окрему змінну

javascript
function handleClick() { console.log('hi'); } button.addEventListener('click', handleClick); button.removeEventListener('click', handleClick); // працює

Тут handleClick - це один і той самий об'єкт функції, тому removeEventListener може його знайти і видалити.

3. Якщо дуже потрібно видалити анонімний обробник

Ти можеш зберегти посилання на нього заздалегідь:

javascript
const handler = () => console.log('hi'); button.addEventListener('click', handler); // пізніше button.removeEventListener('click', handler);

Головне - щоб handler залишався тим самим об'єктом функції.

4. Якщо обробників багато - можна використовувати AbortController

Сучасний і елегантний спосіб:

javascript
const controller = new AbortController(); button.addEventListener('click', () => console.log('clicked'), { signal: controller.signal }); // ...пізніше controller.abort(); // автоматично видаляє обробник

Працює з будь-якими функціями (навіть анонімними), тому що AbortController сам керує їхнім життєвим циклом.

5. Чому це важливо

Якщо ти не видаляєш старі обробники:

  • вони можуть виконуватись кілька разів при кожному кліку,
  • займають пам'ять (витоки),
  • викликають непередбачувану поведінку при ререндері компонентів (у React, наприклад).

Підсумок

СценарійЧи можна видалити?Рішення
Анонімна функціяНіВикористати іменовану або зберегти в змінній
Іменована функціяТакПередати те саме посилання
Багато слухачівТакВикористати AbortController
Динамічне видаленняТакЗберігати функції в Map/об'єкті

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.