Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我应该如何处理要删除的对象的事件处理程序?_Javascript_Node.js - Fatal编程技术网

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

Javascript 我应该如何处理要删除的对象的事件处理程序?,javascript,node.js,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",

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

让我们举一个例子:

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来自


这个物体的作用/性质似乎很重要。我希望能得到一个解释这一点的答案,因为这似乎与我的问题的原因非常相关。我不需要修复代码方面的帮助,我想更好地了解对象和事件处理程序是如何工作的,以及垃圾收集是如何处理事件的。从我目前阅读的参考资料来看,我对自己的行为感到困惑。

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

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

但请确保向其传递要删除的有效
元素,即对象属性。Javascript不允许您在变量上执行此操作。

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

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

但请确保向其传递要删除的有效
元素,即对象属性。Javascript不允许您在变量上执行此操作。

您可以添加
Dog
对象的代码吗?因此,请取消绑定事件。很难说什么,因为我们不知道你的狗对象是什么。如果事件仍然激发,那么对象一定仍然存在。那些“吠叫”事件从何而来?
delete
操作删除属性;它不会影响属性的值。如果对该Dog实例的另一个引用仍然存在,则不会对该对象进行垃圾收集。请提供一个可运行的实例来复制issueOK,那么您可以将mqtt实例绑定到
user
,但随后在处理程序代码中引用
this.user
。用户实例上是否有“user”属性?是否可以添加
Dog
对象的代码?因此取消绑定事件。很难说什么,因为我们不知道你的狗对象是什么。如果事件仍然激发,那么对象一定仍然存在。那些“吠叫”事件从何而来?
delete
操作删除属性;它不会影响属性的值。如果对该Dog实例的另一个引用仍然存在,则不会对该对象进行垃圾收集。请提供一个可运行的实例来复制issueOK,那么您可以将mqtt实例绑定到
user
,但随后在处理程序代码中引用
this.user
。用户实例上有“user”属性吗?好的,所以每次调用delte时,即使对象本身不应该存在,我也必须手动删除事件处理程序?当然,考虑到数组是唯一的引用,是的,我假设一个事件强制持久化对象在内存中的位置,因为javascript引擎是如何工作的,特别是垃圾收集器是如何工作的。这相当复杂,我对这个主题不太了解,但是如果你看看javascript引擎是如何工作的,你会发现一些非常有趣的答案。简而言之,如果指针(您的事件)指向内存地址(您的对象属性),它将告诉垃圾不要收集它。并由此理解调用
delete
并不是真的删除东西……谢谢,我想这是有道理的。否则,用于回调的匿名函数也不会工作。好吧,所以每次调用delte时,即使对象本身不应该再存在,我也必须手动删除事件处理程序?当然,考虑到数组是唯一的引用,是的,我假设一个事件强制持久化对象在内存中的位置,因为javascript引擎是如何工作的,特别是垃圾收集器是如何工作的。这相当复杂,我对这个主题不太了解,但是如果你看看javascript引擎是如何工作的,你会发现一些非常有趣的答案。简而言之,如果指针(您的事件)指向内存地址(您的对象属性),它将告诉垃圾不要收集它。并由此理解调用
delete
并不是真的删除东西……谢谢,我想这是有道理的。否则,用于回调的匿名函数也无法工作。