在Node.js中,是否正在侦听EventEmitter,创build一个对它的引用?
如果我有这样的代码:
const EventEmitter = require('events'); class Bot extends EventEmitter { sendMessage() { // do something this.emit('messageSent', 'user123'); } } class Controller { loadBot() { const bot = new Bot(); bot.on('messageSent', userId => { // do something }); } }
在loadBot
创build的bot
对象会立即被销毁吗? 或者稍后通过垃圾收集?
或者, Controller
的实例是否持有对它的引用,以便在Controller
实例被销毁之前, bot
永远不会被销毁?
注册一个事件监听器本身并不能防止垃圾收集。 有些东西实际上必须引用Bot
对象本身(以便事件可以从中发出),因为它不会被垃圾收集。
在你的Controller类中,如果没有别的东西引用你创build的Bot
实例,那么它将有资格进行垃圾收集。 这是有道理的,因为如果没有对它的引用,那么没有其他东西可以使用它,也没有什么可以调用它的自定义方法sendMessage()
。
现在你已经有了你的代码,你的bot
variables只是loadBot()
方法内部的一个局部variables,没有其他的引用。 因此,只要loadBot()
方法执行loadBot()
, bot
variables就可以进行垃圾收集,因为任何地方都没有代码可以使用或再次访问该对象。 这使得它有资格进行垃圾收集。
从你的代码看,也许你的意思是让bot
variables成为Controller
对象的一个实例variables。 如果是这样的话,那么只要有一些引用了你的Controller
对象,那么这个bot
对象也将保持活着。
所以,看起来也许你打算这样做:
const EventEmitter = require('events'); class Bot extends EventEmitter { sendMessage() { // do something this.emit('messageSent', 'user123'); } } class Controller { loadBot() { this.bot = new Bot(); this.bot.on('messageSent', userId => { // do something }); } send() { this.bot.sendMessage(); } } var c = new Controller(); c.loadBot();
在这里,您保留了对Controller
对象的实例数据中的bot
variables的引用,因此可以通过其他代码(如send()
方法)或访问Controller
对象上的.bot
属性的任何其他代码来访问它。