С

Слушатель

Слушатель — объект или функция в программировании, которая ожидает наступления определённого события и реагирует на него выполнением заданного кода.

Что это

Слушатель (англ. listener или event listener) — это функция или объект, который «подписывается» на определённое событие и автоматически выполняется, когда это событие происходит. Концепция пришла из событийно-ориентированного программирования и сегодня используется повсеместно: от браузерного JavaScript до серверных фреймворков и мобильных приложений. Слушатель не опрашивает систему постоянно — он просто ждёт сигнала и реагирует на него, что делает архитектуру приложения более эффективной и предсказуемой.

Зачем это нужно

До широкого распространения событийной модели разработчики использовали polling — постоянные циклические проверки состояния. Это расходовало ресурсы и усложняло код. Слушатели решили эту проблему: вместо того чтобы каждые 100 миллисекунд спрашивать «пользователь нажал кнопку?», программа просто регистрирует слушателя и занимается другими задачами. Именно слушатели лежат в основе интерактивности веб-страниц, работы UI-фреймворков вроде React и Vue, а также систем реального времени — чатов, уведомлений, игровых движков.

Как это работает

Механизм слушателя строится на трёх шагах: регистрация, ожидание и вызов. Сначала слушатель привязывается к источнику событий — элементу DOM, объекту, сокету или шине событий. Затем система ставит его «на дежурство». Когда событие наступает, среда выполнения находит всех зарегистрированных слушателей и вызывает их по очереди, передавая объект события с деталями произошедшего. В JavaScript это выглядит как вызов метода addEventListener, в Java — реализация интерфейса EventListener, в Python (например, в asyncio или PyQt) — декораторы или методы connect. Один источник может иметь несколько слушателей на одно событие, и все они будут вызваны.

Примеры

  • Браузерный JavaScript: document.querySelector('button').addEventListener('click', handleClick) — слушатель реагирует на клик по кнопке и запускает функцию handleClick.
  • Node.js и EventEmitter: объект emitter.on('data', callback) подписывается на поток данных и обрабатывает каждый входящий чанк.
  • Android-разработка: View.OnClickListener — интерфейс, который реализуется для обработки нажатий на элементы интерфейса в приложениях на Java или Kotlin.
  • Spring Framework (Java): аннотация @EventListener позволяет методу автоматически реагировать на публикацию ApplicationEvent внутри контекста приложения.
  • Игровые движки: в Unity метод OnCollisionEnter выступает слушателем события столкновения объектов — он вызывается физическим движком в момент контакта.

Связанные понятия

  • Событие (Event) — действие или изменение состояния, на которое реагирует слушатель: клик, загрузка данных, ошибка.
  • Обработчик событий (Event Handler) — часто используется как синоним слушателя, хотя строго говоря обработчик — это конкретная функция, а слушатель — механизм её регистрации.
  • Паттерн Observer — архитектурный шаблон, в котором слушатели называются наблюдателями (observers), а источник событий — субъектом (subject).
  • Шина событий (Event Bus) — посредник, через который компоненты публикуют события и подписываются на них, не зная друг о друге напрямую.
  • Callback — функция обратного вызова, которую слушатель передаёт системе для выполнения при наступлении события.

Частые ошибки

Самая распространённая проблема — утечка памяти из-за незарегистрированных слушателей. Если компонент удаляется из DOM или объект уничтожается, но слушатель не был снят через removeEventListener или аналогичный метод, он продолжает удерживать ссылки на объекты в памяти. В долго живущих SPA-приложениях это приводит к постепенному росту потребления памяти. Вторая ошибка — регистрация одного и того же слушателя несколько раз в цикле, из-за чего событие обрабатывается кратно. Третья — путаница между слушателем и обработчиком: атрибут onclick в HTML — это обработчик, и он может быть только один, тогда как addEventListener позволяет навесить неограниченное количество слушателей на одно событие.

Другие термины на букву «С»