You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

有C#开发背景,如何在JavaScript中实现自定义事件的创建、订阅与分发?

方案1:基于浏览器原生EventTarget实现(无需第三方依赖,现代浏览器均支持)

EventTarget是所有支持事件的DOM对象的基类,也可以直接实例化或者继承来实现自定义事件,完全可以脱离DOM元素使用:

// 1. 创建事件目标载体,对应C#中声明事件的类实例
const eventHub = new EventTarget();
// 2. 定义你的委托函数
function myFunction() {
    console.log("delegated call achieved!");
}

// 订阅逻辑位置,对应C#的 myEvent += myFunction
function whatever1() {
    eventHub.addEventListener('onMyConditionIsMet', myFunction);
}

// 触发逻辑位置,对应C#的 myEvent?.invoke()
function whatever2() {
    eventHub.dispatchEvent(new Event('onMyConditionIsMet'));
}

如果需要取消订阅,调用eventHub.removeEventListener('onMyConditionIsMet', myFunction)即可。

方案2:Node.js环境下使用内置EventEmitter

Node.js标准库自带的events模块就是专门用于自定义事件的实现,用法更贴近C#的事件语法:

const { EventEmitter } = require('events');
// 1. 创建事件载体
const eventHub = new EventEmitter();

function myFunction() {
    console.log("delegated call achieved!");
}

// 订阅
function whatever1() {
    eventHub.on('onMyConditionIsMet', myFunction);
}

// 触发,内部会自动判断是否有订阅者,无订阅时不会报错
function whatever2() {
    eventHub.emit('onMyConditionIsMet');
}

取消订阅用eventHub.off('onMyConditionIsMet', myFunction)。

方案3:跨环境极简自定义实现(完全无依赖,和C#委托逻辑完全对齐)

如果不想依赖环境内置API、完全规避DOM相关逻辑,只需要实现你需要的订阅、触发逻辑,手写10行左右代码即可,完全匹配你C#无参委托事件的使用习惯:

class SimpleEvent {
    #callbacks = [];
    // 订阅,对应 += 操作
    on(callback) {
        this.#callbacks.push(callback);
    }
    // 取消订阅,对应 -= 操作
    off(callback) {
        this.#callbacks = this.#callbacks.filter(cb => cb !== callback);
    }
    // 触发,对应 ?.invoke()
    invoke() {
        this.#callbacks.forEach(cb => cb());
    }
}

// 使用示例
const myEvent = new SimpleEvent();
function myFunction() {
    console.log("delegated call achieved!");
}

function whatever1() {
    myEvent.on(myFunction); // 对应C# myEvent += myFunction
}

function whatever2() {
    myEvent.invoke(); // 对应C# myEvent?.invoke(),无订阅时无副作用
}

内容的提问来源于stack exchange,提问作者rustyBucketBay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 00:06:03