javascript ES6类/方法范围

javascript ES6 class/method scope

本文关键字:方法 范围 ES6 javascript      更新时间:2023-09-26

我不知道如何更正方法的上下文。

我有这个班:

export default class Handler {
    constructor() {
        // init
    }
    handleMessage(channel, user, message) {
        this.handleDefault(channel, user, message);
    }
    handleDefault(chanenl, user, message) {
        // do stuff
    }
}

它被这个方法和类调用

export default class Bot {
    constructor() {
        this.irc     = irc // has an event emitter irc.event
        this.handler = new Handler();
        this.readIRC();
    }
    readIRC() {
        this.irc.event.on('message', this.handler.handleMessage);
    }
}

问题出在handleMessage内的第一个类中,这不再是类,而是eventEmitter,所以我不能调用我的handleDefault方法。

如何在ES6中正确处理上下文?

您只需要将handleMessage绑定到this.handler,或者使用

  • Function.prototype.bind

    this.irc.event.on('message', this.handler.handleMessage.bind(this.handler));
    
  • 或具有箭头功能,

    this.irc.event.on('message', () => this.handler.handleMessage());
    

在这两种情况下,当message事件调用handleMessage函数时,handleMessage中的this将引用this.handle对象。


如果您想将参数传递给事件处理程序,可以定义如下所示的箭头函数

this.irc.event.on('message', (err, msg) => this.handler.handleMessage(err, msg));