Слушатель
Слушатель — объект или функция, ожидающая наступления определённого события и реагирующая на него выполнением заданного кода.
Слушатель (англ. event listener) — это функция или объект, который регистрируется в системе для отслеживания определённого события и автоматически вызывается в момент его наступления.
Концепция слушателей событий лежит в основе событийно-ориентированного программирования (Event-Driven Programming), которое получило широкое распространение в 1990-х годах вместе с развитием GUI-приложений и веб-технологий. Сегодня слушатели применяются повсеместно: в браузерном JavaScript, серверных фреймворках (Node.js), мобильной разработке (Android, iOS), игровых движках и системах реального времени. Ключевая идея — разделение источника события и кода, который на него реагирует, что снижает связанность компонентов системы.
Принцип работы слушателя
Слушатель работает по модели «подписка — уведомление». Компонент-источник (эмиттер) генерирует событие и оповещает всех зарегистрированных слушателей, передавая им объект события с данными. Каждый слушатель обрабатывает событие независимо, не зная о существовании других подписчиков. Это позволяет добавлять и удалять обработчики без изменения логики источника.
Регистрация слушателя, как правило, выполняется методом типа addEventListener (в DOM) или on/subscribe (в других фреймворках). После регистрации слушатель остаётся активным до явного удаления через removeEventListener или аналогичный метод. Забытые слушатели — распространённая причина утечек памяти: в крупных SPA-приложениях это может привести к росту потребления памяти на 50–200 МБ за сессию.
- Одноразовый слушатель — срабатывает единожды и автоматически удаляется (опция once: true в DOM API)
- Постоянный слушатель — остаётся активным до явного вызова removeEventListener
- Пассивный слушатель — не вызывает preventDefault(), что ускоряет обработку scroll и touch-событий
- Делегированный слушатель — устанавливается на родительский элемент и обрабатывает события дочерних через всплытие
- Глобальный слушатель — подписывается на события всей системы или шины событий (EventBus)
Примеры использования
В браузерном JavaScript слушатель клика регистрируется командой document.querySelector('#btn').addEventListener('click', handleClick). При нажатии кнопки браузер создаёт объект MouseEvent и передаёт его в функцию handleClick. Делегирование событий на список из 1000 элементов вместо навешивания 1000 отдельных слушателей сокращает потребление памяти примерно в 10–15 раз.
В Node.js слушатели используются через встроенный модуль EventEmitter: emitter.on('data', callback) подписывает обработчик на поток данных. В Android-разработке View.OnClickListener — стандартный интерфейс-слушатель, реализуемый для обработки касаний. В архитектуре микросервисов слушатели подписываются на очереди сообщений (Kafka, RabbitMQ), обрабатывая тысячи событий в секунду без прямой связи между сервисами.