我想知道处理注册了事件处理程序的对象的正确且最简单的方法是什么。
让我们举个例子:
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 = []
现在客户端对象消失了,但事件处理程序似乎仍然存在,因为我现在因用户未定义而抛出错误。
我假设垃圾收集器会处理不再存在的对象的事件处理程序。
编辑:看来我简化得太多了。我更改了代码以反射(reflect)实际存在的对象。 mqtt 来自mqtt.js
看来对象的作用/是什么很重要。我希望得到一个能够解释原因的答案,因为它似乎与我遇到问题的原因非常相关。我不需要帮助来修复我的代码,我想更好地了解对象和事件处理程序如何工作以及垃圾收集如何处理。从迄今为止我阅读的资源来看,我所得到的行为似乎让我感到困惑。
最佳答案
如果您经常这样做,您可以创建自己的函数来处理这种情况。例如:
const unbindAndDelete = (element, event = 'bark', handler = 'barkHandler') => {
element.removeEventListener(event, handler);
delete element;
}
但请务必向其传递一个要删除的有效元素
,即对象属性。 Javascript 不会让你对变量执行此操作。
关于javascript - 我应该如何处理要删除的对象的事件处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276074/