当我将函数注册为事件时,不会调用所述函数内的emit。它自称的函数(由log测试)。现在,当我使用方法2注册事件时,它可以工作。这是为什么?
方法1(不调用事件):
"use strict";
const EventEmitter = require("events");
class DiscordBot extends EventEmitter{
constructor(key){
super();
}
startBot(){
var self = this;
this.bot.on("ready",self.botReady);
}
botReady(){
var self = this;
self.emit("Bot_Ready");
console.log("TESD");
}
}
方法2(有效):
"use strict";
const EventEmitter = require("events");
class DiscordBot extends EventEmitter{
constructor(key){
super();
}
startBot(){
var self = this;
this.bot.on("ready",function () {
self.botReady();
});
}
botReady(){
var self = this;
self.emit("Bot_Ready");
console.log("TESD");
}
}
寄存器:
bot.on("Bot_Ready", function(){
console.log('this happens ');
});
答案 0 :(得分:1)
这会创建一个closure:
this.bot.on("ready",function () {
self.botReady();
});
方法1不:
startBot(){
var self = this;
this.bot.on("ready",self.botReady);
}
从上面的MDN链接:
闭包是一种特殊的对象,它结合了两件事: 功能,以及创建该功能的环境。该 环境由任何在范围内的局部变量组成 关闭创建的时间。
这是另一个可能有助于解释的好链接:
How do JavaScript closures work?
请注意这一部分:
在JavaScript中,如果在另一个内部使用function关键字 函数,你正在创建一个闭包。
答案 1 :(得分:0)
“也许你失去了背景,你需要使用像这样的箭头函数this.bot.on(”ready“,()=> this.botReady());” - @yurzui
像魅力一样工作。