javascript - 我应该如何处理要删除的对象的事件处理程序?
问题描述
我想知道处理已注册事件处理程序的对象的正确且最简洁的方法是什么。
让我们举这个例子:
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
对象做什么/是什么似乎很重要。我很感激能解释为什么这与我遇到问题的原因非常相关的答案。我不需要帮助来修复我的代码,我想更好地了解对象和事件处理程序是如何工作的,以及垃圾收集是如何处理的。从我目前阅读的资源来看,我得到的行为似乎让我感到困惑。
解决方案
如果您经常这样做,您可以创建自己的函数来处理这种情况。例如 :
const unbindAndDelete = (element, event = 'bark', handler = 'barkHandler') => {
element.removeEventListener(event, handler);
delete element;
}
但一定要传递给它一个有效element
的删除,即一个对象属性。Javascript 不会让你对变量执行此操作。
推荐阅读
- scala - 我想在 0 到 1 的范围内标准化我的数据值
- c++ - C++ wxWidgets:设置透明背景颜色
- javascript - TypeError:this.getInciData 不是函数
- jwt - 如何处理 auth0 中超出长度的 jwt 访问令牌
- jquery - 从 jquery 1.12.4 迁移到 3.5.1 时出现“Jquery 未定义”
- python - 时间序列分钟数据 - 如何选择给定间隔的数据
- reactjs - MSAL.js 令牌有效
- python - 如何在重命名键时合并具有相同键的字典?
- reactjs - 替代非 create-react-app 应用程序中的 create-react-app“主页”设置
- python - 在 Tkinter 中释放 RAM(Python 3.6)