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

为什么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指向即可:

  1. 传递函数时用bind绑定myReciever实例上下文
myEmitter.setEvent(myReciever.ping.bind(myReciever));
  1. 用箭头函数包裹调用,天然保留外层上下文
myEmitter.setEvent((message) => myReciever.ping(message));
  1. 将Reciever的ping方法定义为箭头函数类属性,永久绑定实例上下文
class Reciever {
  constructor() {
    this.messages = []
  }
  ping = (message) => {
    console.log(message)
    this.messages.push(message)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:09:03