Javascript 在一个函数中包含两个类时出现此问题

Javascript 在一个函数中包含两个类时出现此问题,javascript,ecmascript-6,Javascript,Ecmascript 6,我在一个函数中有两个类,由于某种原因,在第二个函数中,未正确识别此 这些类是发射器和接收器 我正在试图弄清楚为什么这里没有正确地拾取这个。该日志包含在以下代码中: const chat = (messages) => { class Emitter { constructor(messages = []) { this.messages = messages; this.event = () => {}; } setEvent(f

我在一个函数中有两个类,由于某种原因,在第二个函数中,
未正确识别此

这些类是
发射器
接收器

我正在试图弄清楚为什么这里没有正确地拾取
这个
。该日志包含在以下代码中:

const chat = (messages) => {
  class Emitter {
    constructor(messages = []) {
      this.messages = messages;
      this.event = () => {};
    }

    setEvent(fn) {
      this.event = fn;
    }

    trigger() {
      this.messages.forEach(message => this.event(message));
    }
  }

  class Receiver {
    constructor() {
      this.messages = [];
      // this prints correctly here
      ---> Receiver { messages: [] }
      console.log('this  ===> ', this)
    }

    ping(message) {
      console.log('this ===>', this)
      // this here prints the following
      this ===> Emitter {
        messages: [ 'Hi', 'Hola', 'Bonjour', 'Hi' ],
        event: [Function: ping] }
          this.messages.push(message);
       }
  }

  const myReceiver = new Receiver();
  const myEmitter = new Emitter(messages);

  myEmitter.setEvent(myReceiver.ping);
  myEmitter.trigger();

  return myReceiver.messages;
};

取决于调用它的范围,而不是定义它的范围。 在调用myMitter.setEvent(myReceiver.ping)时,只有函数ping被传递给myMitter,而不是它的作用域myReceiver。如果希望传递myRevciever作用域,可以将其绑定到函数调用


myMitter.setEvent(myReceiver.ping.bind(myReceiver))只是补充这个答案:一种常见的做法是在构造函数中绑定类方法。调用对象“scope”是不正确的。你可以选择“目标”或“接收者”。