为什么Reciever类的实例方法接收不到数据,打印messages返回空数组?
问题原因分析
- 核心原因:
ping方法执行时this指向丢失
当你将myReciever.ping作为参数传入setEvent时,仅传递了函数本身的引用,没有绑定对应的执行上下文。后续Emitter触发event回调时,ping内部的this会指向调用它的myEmitter实例,而非myReciever实例。此时this.messages.push操作的是myEmitter自带的messages属性,不会修改myReciever的messages数组,因此最终打印结果为空数组。 - 次要问题:
Emitter实例化参数写法不规范
代码中const myEmitter = new Emitter(message = ["A", "B", "C"])属于错误的赋值型传参写法,会意外创建全局变量message,但该问题不会导致本次空数组结果,仅为代码规范问题。
修复方案
选择以下任意一种方案修正this指向即可:
- 传递函数时用
bind绑定myReciever实例上下文
myEmitter.setEvent(myReciever.ping.bind(myReciever));
- 用箭头函数包裹调用,天然保留外层上下文
myEmitter.setEvent((message) => myReciever.ping(message));
- 将
Reciever的ping方法定义为箭头函数类属性,永久绑定实例上下文
class Reciever { constructor() { this.messages = [] } ping = (message) => { console.log(message) this.messages.push(message) } }
内容的提问来源于stack exchange,提问作者Matt Hammond
相关产品推荐
相关产品推荐

