javascript事件机制虽非发布订阅的直接实现,但eventtarget api提供了标准化的订阅(addeventlistener)、取消订阅(removeeventlistener)和发布(dispatchevent)能力,支持同步通知、冒泡捕获等特性,可直接new eventtarget()构建轻量事件总线。

JavaScript 中事件机制本身并不是发布订阅模式的直接实现,但它为构建发布订阅提供了天然基础——核心在于利用对象属性存储回调函数,并通过统一的触发逻辑完成通知分发。
事件对象本质是可监听的回调容器
DOM 元素上的 addEventListener 表面看是“注册监听”,底层其实是把传入的 handler 函数存进元素内部的一个事件类型映射表(如 element._events = { click: [fn1, fn2], input: [fn3] })。这和发布订阅中“主题-订阅者列表”的结构完全一致。
- 每个事件类型(如
"click")对应一个订阅队列 - 调用
dispatchEvent相当于遍历该队列并依次执行所有回调 - 移除监听器就是从对应队列中删掉指定函数引用
自定义事件是发布订阅的直译实现
CustomEvent 和 dispatchEvent 组合,让任意对象都能成为事件总线。它不依赖 DOM,只靠 JS 对象能力,更贴近经典发布订阅语义:
- 创建事件:
const evt = new CustomEvent("data-updated", { detail: { value: 42 } }) - 派发事件:
target.dispatchEvent(evt) - 监听事件:
target.addEventListener("data-updated", handler)
这里的 target 可以是任何实现了 EventTarget 接口的对象(包括 EventTarget 实例),本质上就是一个轻量级事件中心。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
EventTarget API 是标准的发布订阅接口
现代浏览器中,EventTarget 类已标准化为发布订阅的基类。它提供三个关键方法:
-
addEventListener(type, listener, options)—— 订阅(支持捕获/冒泡、once、passive 等语义) -
removeEventListener(type, listener, options)—— 取消订阅 -
dispatchEvent(event)—— 发布(同步执行所有匹配监听器)
你可以直接 new EventTarget() 创建纯逻辑事件总线,无需 DOM 元素,也无需自己维护订阅列表或触发逻辑。
与手写发布订阅的区别在于调度控制权
手写 Pub/Sub 通常允许异步派发、通配符匹配、中间件、返回值聚合等;而原生事件机制默认是同步、精确匹配、无返回值、不可中断(除非 event.stopPropagation() 或 preventDefault())。但它胜在规范、高效、被引擎深度优化。
- 原生事件有冒泡/捕获机制,这是普通 Pub/Sub 没有的层级通信能力
- 事件对象自带生命周期(
isTrusted、cancelable、bubbles等属性) - 多次
dispatchEvent不会重入当前调用栈(避免递归陷阱)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










