Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
JavaScript中如何实现发布订阅_EventEmitter原理_创想鸟

JavaScript中如何实现发布订阅_EventEmitter原理

JavaScript EventEmitter核心是用Map存储事件名与回调数组,on注册、emit触发(浅拷贝+try-catch)、off解绑(需同一函数引用),本质为轻量观察者模式。

javascript中如何实现发布订阅_eventemitter原理

JavaScript 中实现发布订阅(EventEmitter)的核心是维护一个事件监听器列表,通过 on 注册监听、emit 触发通知、off 移除监听。它不依赖 DOM 或浏览器环境,纯逻辑即可完成,本质是“观察者模式”的轻量实现。

事件存储:用对象管理事件名与回调数组

每个事件名(如 "click")对应一个回调函数数组,方便多次 on 同一事件时都能被调用:

用普通对象({})或 Map 存储,键为事件名,值为函数数组 推荐用 Map,避免字符串键名冲突(比如对象的原型属性 toString) 首次注册某事件时,初始化该事件对应的空数组

注册监听:on 方法支持重复添加和 once 一次性监听

on(eventName, callback) 把回调推入对应事件数组;once(eventName, callback) 可封装为:触发后自动调用 off 移除自己:

内部可给回调加标记(如 callback._once = true),emit 时执行后清理 更稳妥的做法是包装一层匿名函数,在执行后调用 off,避免污染原始函数 注意:不能直接用 === 比较匿名函数,所以 off 必须传入**同一个引用**的函数

触发通知:emit 遍历执行并支持传参与错误处理

emit(eventName, ...args) 查找该事件的所有监听器,依次调用,并传递参数:

立即学习“Java免费学习笔记(深入)”;

执行前先浅拷贝回调数组([...listeners]),防止监听器内部又调用 on/off 导致遍历异常 建议对每个回调用 try...catch 包裹,避免一个报错中断其余监听器执行 可约定返回值或抛错来控制流程(如权限校验失败时中断后续)

移除监听:off 要精准匹配事件名和函数引用

off(eventName, callback) 从对应事件数组中删除指定函数:

只传事件名 → 清空该事件所有监听 传事件名和回调 → 用 splice + indexOf(需严格相等)或遍历 filter 注意:箭头函数、内联函数每次都是新引用,无法被 off,应定义在外部再传入 可扩展支持正则或通配符事件名(如 "user.*"),但属进阶用法

基本上就这些。写一个最小可用的 EventEmitter,几十行就能跑起来,关键不在代码多寡,而在对“注册-触发-解绑”生命周期的理解是否清晰。

以上就是JavaScript中如何实现发布订阅_EventEmitter原理的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1541266.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript标签函数编写_javascript模板处理
上一篇 2025年12月21日 13:10:45
JavaScript移动端适配_JavaScript响应式开发
下一篇 2025年12月21日 13:11:00

相关推荐

  • UC浏览器在线使用官方入口 UC浏览器最新官网

    UC浏览器官方入口是https://www.uc.cn/,该官网提供最新版下载及核心功能如智能搜索、流量压缩、视频优化和夜间模式,并支持跨平台使用与数据同步。 UC浏览器在线使用官方入口在哪里?这是不少用户关心的问题,接下来由PHP小编为大家带来UC浏览器最新官网地址以及相关功能特点,想要了解这款浏…

    2026年9月24日
    000
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    000
  • 将 double 类型窄化为 float 类型时出现不兼容的返回类型

    本文旨在解决在 Java 中将父类的 double 类型返回值在子类中覆盖为 float 类型时遇到的类型不兼容问题。我们将深入探讨问题的原因,并提供使用泛型来解决此问题的有效方法,帮助开发者避免类似错误,并编写更健壮和灵活的代码。 问题分析:返回类型不兼容的原因 在面向对象编程中,子类可以覆盖(O…

    2026年9月24日
    400
  • VSCode主题开发:创建动态色彩主题的进阶技术解析

    动态主题需通过外部插件监听系统事件实现,核心是利用vscode.themeColor API响应主题切换,结合语义化作用域与Semantic Highlighting精准控制配色逻辑,实现智能自适应视觉体验。 想让VSCode主题随环境自动切换色彩?动态主题不只是换个配色那么简单。核心在于理解VSC…

    2026年9月23日
    400
  • PHP同页面无限次表单提交与显示:防止数据覆盖的实现技巧

    本教程详细阐述了如何在php中实现同页面多次表单提交而不覆盖先前数据的方法。核心策略是利用html的数组命名输入(`name=”field[]”`)来收集多个值,并在每次页面刷新时,通过隐藏输入字段重新提交已有的数据,从而在不依赖数据库的情况下,实现“无限”次提交并显示所有历…

    2026年9月23日
    100
  • VS Code自动化测试:持续集成与测试覆盖率

    VS Code通过插件和工具集成支持自动化测试、CI流程与覆盖率分析。①配置Jest或pytest等框架,结合Test Explorer UI插件实现测试运行与调试;②利用GitHub Actions等CI服务,在代码推送后自动执行测试,通过插件在编辑器内查看状态;③启用Coverage Gutte…

    2026年9月23日
    100
  • 悟空浏览器如何使用全局媒体控制器_悟空浏览器多媒体播放控制中心使用技巧

    1、确保悟空浏览器通知权限开启,以激活系统媒体控制;2、检查网站是否配置Media Session API,必要时注入脚本补充元数据与控制函数;3、结合画中画与后台播放功能,维持媒体会话活跃,实现锁屏或切换应用时的持续控制。 如果您在使用悟空浏览器播放网页媒体时,希望利用系统级的媒体控制功能来管理播…

    2026年9月23日
    100
  • RapidMiner的AI混合工具如何操作?快速实现数据挖掘的实用方法

    RapidMiner通过可视化流程整合数据导入、清洗、特征工程、模型训练与部署,支持文本挖掘、时间序列分析及模型优化,可扩展自定义代码实现AI混合分析。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ RapidMiner的AI混合工具,简单…

    2026年9月23日
    500
  • OOP设计原则SOLID在Java开发中的应用

    SOLID原则提升Java代码可维护性与扩展性:1. 单一职责确保类只负责一项功能;2. 开闭原则支持扩展而非修改;3. 里氏替换保证子类可替代父类;4. 接口隔离避免实现无用方法;5. 依赖倒置使高层依赖抽象而非具体实现,结合设计模式更佳。 SOLID 是面向对象编程(OOP)中五个核心设计原则的…

    2026年9月23日
    400
  • 抖音怎么保存视频?抖音视频保存不了

    抖音作为当下年轻人热衷的社交平台之一,已经成为记录生活、分享日常的重要工具。平台上的视频内容丰富多样,吸引了大量用户观看。然而,很多用户在欣赏完精彩视频后,却无法顺利将视频保存下来。本文将为您全面解析抖音视频的保存方法,帮助您轻松掌握技巧,留住每一个精彩瞬间。 一、抖音视频保存方式 1. 借助第三方…

    2026年9月23日
    300
  • 谷歌浏览器怎么关闭密码泄露检查_Chrome密码安全检查功能关闭教程

    关闭Chrome密码泄露警告的方法如下:1、进入设置→隐私设置和安全性→安全,关闭“当密码遭遇数据泄露时发送警告”;2、在安全检查中点击“您的密码”,选择“忽略此提醒”或删除风险密码;3、右键Chrome快捷方式,属性中目标末尾添加 –disable-password-leak-dete…

    2026年9月23日
    100
  • qq浏览器怎么管理所有已登录的设备_QQ浏览器账号登录设备管理方法

    1、打开QQ浏览器点击「我的」进入个人主页;2、点击头像进入「账号与安全」界面;3、查找并点击设备管理选项查看已登录设备列表,可识别并移除陌生设备以保障账号安全。 如果您在多个设备上登录了QQ浏览器账号,但无法查看或管理已登录的设备列表,可能会导致账号安全风险或同步异常。以下是管理QQ浏览器所有已登…

    2026年9月23日
    000
  • Java类间ArrayList访问:解决“无法解析方法”的包冲突问题

    本文旨在解决Java开发中,一个类(如Bill)无法访问另一个类(如自定义Menu)中ArrayList的常见问题。核心原因通常是包冲突,即系统默认导入的同名类(如java.awt.Menu)覆盖了自定义类。解决方案包括为自定义类声明明确的包,并在使用时进行显式导入,或确保两者位于同一默认包中,从而…

    2026年9月23日
    100
  • 使用 Mp4Parser Java API 创建可播放 MP4 文件的教程

    本文档旨在指导开发者使用 Mp4Parser Java API 创建可播放的 MP4 文件。通过一个简单的复制 MP4 文件结构的例子,深入理解 Mp4Parser 的核心概念和使用方法,帮助开发者避免常见错误,并为更复杂的 MP4 文件操作打下基础。本文将重点讲解如何正确复制 MP4 文件的关键 …

    2026年9月23日
    700
  • 解决NetBeans Java Swing/Maven项目中组件实例化异常问题

    本文将围绕NetBeans Java Swing/Maven项目中遇到的java.lang.InstantiationException展开,该异常通常由于自定义组件缺少默认构造函数而导致。正如问题描述中提到的,当NetBeans尝试实例化自定义组件时,如果该组件没有无参构造函数,就会抛出java.…

    2026年9月23日
    200
  • UC浏览器怎么设置默认搜索引擎_UC浏览器默认搜索引擎设置方法

    可通过UC浏览器设置菜单将默认搜索引擎更改为百度、谷歌、必应或搜狗;2. 在搜索框切换引擎后部分版本可锁定为默认;3. 重置手机默认应用设置可解决外部干扰问题。 如果您在使用UC浏览器时发现搜索结果不理想或希望使用更符合个人习惯的搜索引擎,可以通过修改默认设置来解决。这通常是因为浏览器的默认搜索引擎…

    2026年9月23日
    100
  • 使用正则表达式实现字符串大小写不敏感替换

    本文将介绍如何利用正则表达式,高效、简洁地实现字符串中特定单词的大小写不敏感替换,从而将所有形式的单词统一转换为指定大小写。通过运用正则表达式的“不区分大小写”模式,可以避免为每种大小写变体编写单独的替换条件,极大提升代码的简洁性和可维护性。 在编程实践中,我们经常会遇到需要将字符串中某个单词的所有…

    2026年9月23日
    600
  • 如何在mysql中使用连接池提升并发

    连接池通过复用数据库连接减少开销,提升高并发下系统性能;需根据语言选择HikariCP、SQLAlchemy等组件,合理配置最大连接数、空闲连接等参数,并结合数据库优化与监控调优以充分发挥效果。 在高并发场景下,频繁创建和销毁数据库连接会带来显著的性能开销。MySQL本身不直接提供连接池功能,但可以…

    2026年9月23日
    300
  • Java中利用正则表达式高效提取JSON数组中的独立对象

    本文探讨了如何使用Java的Pattern和Matcher配合正则表达式,从格式化的JSON数组字符串中精确提取出每个独立的JSON对象字符串。文章详细解析了核心正则表达式的工作原理及其对格式的依赖性,并提供了完整的Java代码示例,同时强调了在实际应用中处理JSON的注意事项和更健壮的替代方案。 …

    2026年9月23日
    500
  • 悟空浏览器如何禁用QUIC协议解决网络问题_悟空浏览器关闭QUIC协议操作指南

    首先禁用QUIC协议,进入悟空浏览器地址栏输入wukong://flags,搜索quic并选择禁用,重启浏览器;其次调整网络设置,将IP改为静态并手动设置DNS为8.8.8.8和8.8.4.4;最后清除浏览器缓存与应用数据以重置网络状态。 如果您在使用悟空浏览器时遇到网络连接不稳定、加载缓慢或特定网…

    2026年9月23日
    300

发表回复

登录后才能评论
关注微信