闭包可为事件总线提供轻量、隔离的优先级绑定能力,通过外层函数接收priority参数并返回捕获该权重的回调函数,使每个监听器自带执行顺序依据,无需全局状态或查表;on方法按priority插入链表实现优先执行,WeakMap保障去重与上下文隔离,并兼容多事件名、once语义及错误处理。

闭包能为事件总线提供轻量、隔离的优先级绑定能力,不依赖全局状态,也不需要重写核心调度逻辑。关键在于把权重固化在监听器函数内部,让每个回调自带执行顺序依据。
用闭包封装带权重的监听器函数
每次注册监听器时,用外层函数接收 priority 参数,并返回一个捕获该权重的回调函数:
- 这样每个监听器都“记住”自己创建时的优先级,无需额外映射表或运行时查表
- 权重值在函数定义时就确定,不受后续调用影响,避免竞态或误覆盖
- 示例中使用
DEFAULT_PRIORITY = 1000作为基准,数值越大,越靠前执行
在事件注册阶段注入权重排序逻辑
总线的 on 方法需支持传入 priority,并在内部按权重插入监听器链表(而非简单追加):
- 监听器以链表形式存于
_listeners[eventName],新监听器按 priority 插入合适位置 - 高权重监听器排在链表前端,
fire时遍历链表自然实现优先执行 - 若 priority 相同,按注册先后保持 FIFO,保证行为可预测
结合 WeakMap 实现监听器去重与上下文隔离
闭包配合 WeakMap 可安全管理监听器生命周期和 this 绑定:
- 用 WeakMap 存储
callback → wrappedCallback映射,避免强引用导致内存泄漏 - 对传入的
that(this 上下文),在闭包内绑定并缓存,确保多次触发不重复 bind - 取消订阅
off时,直接通过原始 callback 查 WeakMap 获取对应包装函数,精准移除
兼容原生事件名匹配与扩展性设计
闭包封装的权重机制必须与事件总线的基础能力正交共存:
- 支持单事件名(
'click')或多事件名数组(['load', 'error']),权重对每个事件独立生效 - 保留
once语义:闭包内可标记已执行状态,fire 后自动从链表摘除 - 错误处理(
handleError)仍作用于原始回调,不因闭包包装而丢失堆栈信息

















