Проверяет понимание того, как отслеживать количество зарегистрированных и удалённых обработчиков событий, чтобы избежать утечек памяти и лишних вызовов.
В JavaScript нет встроенного публичного API, который бы возвращал точное количество обработчиков на элементе. Однако разработчики могут использовать инструменты браузера и собственные обёртки, чтобы контролировать жизненный цикл слушателей.
В консоли Chrome доступна недокументированная, но полезная функция getEventListeners(element). Она возвращает объект, где ключи — типы событий, а значения — массивы слушателей. Это позволяет вручную проверить, сколько обработчиков зарегистрировано и остались ли они после удаления.
const btn = document.querySelector('#btn');
btn.addEventListener('click', handler1);
btn.addEventListener('click', handler2);
console.log(getEventListeners(btn)); // { click: [listener1, listener2] }
btn.removeEventListener('click', handler1);
console.log(getEventListeners(btn)); // { click: [listener2] }Надёжнее всего вести учёт самостоятельно: обернуть addEventListener и removeEventListener в функции-счётчики или использовать Map, где ключ — элемент, а значение — набор слушателей. Такой подход даёт полный контроль и работает во всех браузерах.
const registry = new WeakMap();
function addTracked(el, type, fn) {
el.addEventListener(type, fn);
if (!registry.has(el)) registry.set(el, []);
registry.get(el).push({ type, fn });
}
function removeTracked(el, type, fn) {
el.removeEventListener(type, fn);
const list = registry.get(el) || [];
registry.set(el, list.filter(l => l.fn !== fn || l.type !== type));
}В Chrome DevTools на вкладке Memory можно снять Heap Snapshot и найти объекты, которые должны были быть собраны сборщиком мусора, но остались из-за ссылок в слушателях. Также полезно использовать Performance Monitor для отслеживания роста числа узлов DOM и слушателей.
Итог: для быстрой проверки в Chrome используйте getEventListeners, а для production-кода — собственный реестр обработчиков или WeakMap, чтобы гарантировать корректное удаление и избежать утечек памяти.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию