箭头函数不适合做事件监听器,因其每次定义都生成新引用,导致off无法匹配移除;应使用命名函数或变量保存同一引用,或用工厂函数封装闭包逻辑。

在事件总线(Event Bus)中,**不建议直接用箭头函数绑定回调**,因为箭头函数无法被正确移除——这是由它的匿名性和无绑定 this 特性决定的。
为什么箭头函数不适合做事件监听器?
事件总线通常依赖 on(event, callback) 和 off(event, callback) 配对使用。而 off 的原理是通过引用比对来移除指定回调。箭头函数每次定义都会创建一个新引用,即使写法相同,也无法被识别为“同一个函数”:
bus.on('data', () => console.log('hello')); // 第一次
bus.off('data', () => console.log('hello')); // ❌ 不生效:这是另一个函数
正确做法:用命名函数或变量保存引用
确保注册和注销时使用**同一个函数引用**:
- 用函数声明或函数表达式命名,并复用该变量
- 避免在
on中现场写箭头函数 - 若需闭包环境,可在外部定义并捕获变量
const handleData = (payload) => {
console.log('received:', payload);
};
bus.on('data', handleData);
// ... later
bus.off('data', handleData); // ✅ 成功移除
需要动态参数?用工厂函数封装
如果必须在监听时传入额外上下文(比如组件实例、ID),可提前生成带绑定逻辑的函数并保存引用:
立即学习“Java免费学习笔记(深入)”;
const createHandler = (id) => (data) => {
console.log(`[${id}] got`, data);
};
const handler = createHandler('user-123');
bus.on('update', handler);
// ... later
bus.off('update', handler); // ✅ 可移除
Vue 2/3 或自定义 Bus 的特别提醒
Vue 2 的 Vue.prototype.$on/$off、Vue 3 的 mitt / tiny-emitter 等,都遵循“引用匹配”机制。即使是 once 或自动清理场景,也依赖函数身份一致性。强行用箭头函数会导致内存泄漏或重复监听。


















