当前位置: 首页 > news >正文

如何用闭包实现一个简单的发布订阅者模式

闭包通过在工厂函数内声明handlers数组并返回操作它的函数,确保订阅者列表私有且持久;事件名作键、回调作引用值,解绑需严格比对函数实例;emit中用slice()复制数组避免遍历时被修改。闭包怎么保存订阅者列表闭包的核心作用是让内部函数持续访问外部函数的变量,而不被垃圾回收。发布订阅模式里,订阅者列表 handlers 必须私有且持久——不能暴露给外部直接修改,也不能在每次调用时重置。常见错误是把 handlers 声明在全局或模块顶层,导致多个实例共享同一组回调;或者写成普通对象方法,this 绑定错、状态丢失。必须在工厂函数(如 createEventBus)内部声明 handlers 数组所有操作(on、emit、off)都通过返回的闭包函数访问它避免使用 class 或 this,否则闭包意义被削弱,容易意外暴露状态function createEventBus() { const handlers = {}; return { on(event, fn) { /* ... */ }, emit(event, data) { /* ... */ }, off(event, fn) { /* ... */ } };}如何正确处理事件名和回调的绑定与解绑事件名是字符串键,回调是引用值,解绑(off)失败最常见原因是:用匿名函数订阅后试图用另一个匿名函数解绑,或没比对函数引用而是比对内容。闭包模式下,handlers[event] 存的是函数引用数组,off 时必须用 === 判断是否为同一函数实例。禁止在 on 里传入内联箭头函数:bus.on('click', () => {...}) → 后续无法 offoff 时要遍历 handlers[event],用 findIndex + === 匹配,再用 splice支持通配符(如 'user.*')需额外解析逻辑,不在基础闭包范围内,容易引入正则或字符串匹配开销const handler = (data) => console.log(data);bus.on('login', handler);bus.off('login', handler); // ? 可行bus.off('login', (d) => console.log(d)); // ? 不会生效为什么 emit 里要用 slice() 遍历回调列表执行 emit 时,回调函数内部可能调用 on 或 off,直接遍历原数组会导致索引错乱、漏调或重复调用——这是闭包封装下最容易被忽略的并发陷阱。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

http://www.jsqmd.com/news/734423/

相关文章:

  • AI Agent技能管理:中央仓库+符号链接实现高效部署与同步
  • Java全栈工程师面试实录:从基础到微服务的深度解析
  • 如何快速提升AI图像质量:5个关键技巧完整指南
  • 2026年3月规模大的环保储水罐生产厂家推荐,隔油池/化粪池/混凝土化粪池/玻璃钢化粪池,环保储水罐企业哪个好 - 品牌推荐师
  • 如何轻松实现网盘直链解析:5步告别下载限制的终极指南
  • Swoole TaskWorker + LLM微批处理长连接方案(非HTTP/1.1!),如何实现单机承载5000+持续对话流并保障<200ms端到端延迟?
  • R数据工程师必读:Tidyverse 2.0自动报告模块性能基准测试——12万行×87列数据集下,render_time从8.4s降至1.9s的5个关键调优动作
  • VGG-T3:线性复杂度的大规模3D重建技术解析
  • MySQL 生产环境 6 大坑,每一个都可能是 P0 事故(生产运维篇)
  • EASY-HWID-SPOOFER终极指南:内核级硬件信息欺骗技术深度解析
  • 一个命令行工具,让背单词变成一件很酷的事
  • 快速上手KLayout:7步掌握开源版图设计工具
  • 从蓝牙耳机到智能音箱:深入聊聊PCM音频数据流在真实设备里的‘旅程’
  • 座舱式个人飞行器 - 接线图解与电气连接
  • 30岁还在写增删改查,我不想卷了,也不想躺了
  • Midscene.js:用AI视觉模型轻松实现跨平台智能自动化
  • MCP 2026国产化迁移成本黑洞:3类隐性开销未计入预算(附工信部认证TCO测算模板V2.6)
  • AI功能上线即超支?Laravel 12服务编排层成本熔断机制,精准拦截83%隐性支出
  • 高效视频对比工具video-compare:5个专业技巧深度解析
  • ESP32-S3开发板WiFIRCard:智能家居与工业控制解决方案
  • file 浏览
  • 为什么92%的量子算法工程师在Docker 27升级后遭遇qubit仿真失败?——NIST认证的5步诊断协议曝光
  • 别再只会删.condarc了!Miniconda在Linux服务器上遇到‘An unexpected error‘的三种深度排查思路
  • XGP存档提取器:3分钟实现Xbox Game Pass游戏进度无损迁移
  • ElasticSearch 项目实战,ES 如何使用,ES 的作用,代码已发布 Gitee
  • 终极指南:5分钟在Photoshop中集成AI绘画功能
  • 避开这个坑!Proteus 仿真 STM32 ADC 采样值为0的排查与解决思路
  • 从UI交互到数据绑定:详解Unity 2D日期选择器组件的设计与事件处理逻辑
  • 2026年5月阿里云部署OpenClaw/Hermes Agent详解+百炼token Plan速成攻略
  • 手把手教你用VirtualBox虚拟盘给ZFS zpool做缓存测试,安全又方便