What is the event emitter pattern in JavaScript?

Answer

The Event Emitter (Pub/Sub) pattern decouples producers from consumers — emitters broadcast events without knowing who is listening; subscribers listen without knowing who emitted. In Node.js: const EventEmitter = require("events"); class Store extends EventEmitter { setData(data) { this.data = data; this.emit("change", data); } }. In browsers: DOM events follow this pattern. Custom implementation: class EventEmitter { constructor() { this.events = {}; } on(event, cb) { (this.events[event] ??= []).push(cb); return this; } emit(event, ...args) { (this.events[event] || []).forEach(cb => cb(...args)); } off(event, cb) { this.events[event] = (this.events[event] || []).filter(fn => fn !== cb); } once(event, cb) { const wrapper = (...args) => { cb(...args); this.off(event, wrapper); }; this.on(event, wrapper); } }. React's state management libraries (Redux, Zustand), Vue's reactivity, and RxJS all build on this pattern. Always remove listeners when components unmount to prevent memory leaks.