我应该如何处理要删除的对象的事件处理程序?

时间:2018-09-11 12:34:43

标签: javascript node.js

我想知道处理已注册事件处理程序的对象的正确和最少冗长的方法是什么。

让我们举个例子:

const mqtt = require('mqtt')
var users = []

function createClient(){
var user = { 'name': 'barney', 'age': 36, 'client': client: mqtt.connect('mqtt://127.0.0.1'), 'active': false }
user.client.on("message",messageHandler.bind(user))
users.push(user)
}

function messageHandler(topic, message){
console.log(`'User' ${this.name} received ${message} on ${topic}`)
}

createClient()
delete users[0].client
users = []

现在,客户端对象已消失,但事件处理程序似乎仍然存在,因为我现在由于用户未定义而引发了错误。

我本以为垃圾收集器将处理不再存在的对象的事件处理程序。

编辑:看来我简化太多了。我更改了代码以反映实际的现有对象。 mqtt来自mqtt.js

对象的作用/作用似乎很重要。我希望能得到一个答案,该答案解释了为什么这与我为什么遇到问题非常相关。我不需要修复代码的帮助,我想更好地了解对象和事件处理程序的工作方式以及垃圾回收的处理方式。从到目前为止我读到的资源中,我所得到的行为似乎使我感到困惑。

1 个答案:

答案 0 :(得分:4)

如果经常这样做,则可以创建自己的函数来处理这种情况。例如:

const unbindAndDelete = (element, event = 'bark', handler = 'barkHandler') => {
  element.removeEventListener(event, handler);
  delete element;
}

但是请确保将有效的element传递给它以删除,即对象属性。 Javascript不允许您对变量执行此操作。