Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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 在JS/NodeJS中,当对象从数组中移除时,会发生什么情况?_Javascript_Arrays_Node.js_Memory - Fatal编程技术网

Javascript 在JS/NodeJS中,当对象从数组中移除时,会发生什么情况?

Javascript 在JS/NodeJS中,当对象从数组中移除时,会发生什么情况?,javascript,arrays,node.js,memory,Javascript,Arrays,Node.js,Memory,我想运行一系列神经网络训练器,它运行在一个无限循环上,如下所示: Trainer.prototype.tick = function(){ // do the try something and record the score setTimeout(function(){ this.tick() },0); } 到目前为止,它做得很好,但当我想更新训练数据和神经网络时,我将从数组中删除trainer实例,并替换为新实例。 所以问题是它真的会删除旧实例并释放内存吗?Java

我想运行一系列神经网络训练器,它运行在一个无限循环上,如下所示:

Trainer.prototype.tick = function(){
  // do the try something and record the score
  setTimeout(function(){
    this.tick()
  },0);
}
到目前为止,它做得很好,但当我想更新训练数据和神经网络时,我将从数组中删除trainer实例,并替换为新实例。
所以问题是它真的会删除旧实例并释放内存吗?

Javascript是一种垃圾收集语言。这意味着当没有活动的、可访问的代码仍然具有对对象的引用时,它会自动从内存中删除对象。因此,如果从数组中删除该对象,并且代码中没有其他变量或属性引用该对象,那么该对象将有资格进行垃圾收集,系统将释放它所占用的内存

当您的
setTimeout()
处于活动状态时,仍然存在对对象的引用,因此在触发
setTimeout()
之前无法对其进行垃圾收集。但是,由于您使用的计时器值为
0
,计时器将很快启动,并且对对象的特定引用将被清除

但是,您的
setTimeout()
会立即尝试调用
this.tick()
。如果该调用成功,它将设置另一个
setTimeout()
,这样它就永远不会停止,也永远不会被垃圾收集。你必须停止设置新的计时器来进行垃圾收集


但是,在您显示的代码中,
this
的值不会指向您的
Trainer
对象,因此对
this.tick()
的调用将失败,并且不会设置新的计时器,
setTimeout()
运行且
this.tick()
调用失败时,对象将准备好进行垃圾收集。

Javascript是一种垃圾收集语言。这意味着当没有活动的、可访问的代码仍然具有对对象的引用时,它会自动从内存中删除对象。因此,如果从数组中删除该对象,并且代码中没有其他变量或属性引用该对象,那么该对象将有资格进行垃圾收集,系统将释放它所占用的内存

当您的
setTimeout()
处于活动状态时,仍然存在对对象的引用,因此在触发
setTimeout()
之前无法对其进行垃圾收集。但是,由于您使用的计时器值为
0
,计时器将很快启动,并且对对象的特定引用将被清除

但是,您的
setTimeout()
会立即尝试调用
this.tick()
。如果该调用成功,它将设置另一个
setTimeout()
,这样它就永远不会停止,也永远不会被垃圾收集。你必须停止设置新的计时器来进行垃圾收集


但是,在您显示的代码中,
this
的值不会指向您的
Trainer
对象,因此对
this.tick()
的调用将失败,并且不会设置新的计时器,
setTimeout()
运行且
this.tick()
调用失败时,该对象将准备进行垃圾收集。

这是否意味着它将运行最后一个循环,然后将被完全删除?@HankPhung-我不知道“运行最后一个循环”是什么意思。对不起,我的意思是它将再运行一个循环,然后停止并删除?@HankPhung-我直到现在才意识到您的
设置超时()
正在尝试调用
this.tick()
,这将设置另一个
setTimeout()
。但是,对
this.tick()
的调用将因显示的代码而失败。无论如何,请看我在回答中添加的更多解释。这是否意味着它将运行最后一个循环,然后将被完全删除?@HankPhung-我不知道“运行最后一个循环”是什么意思。对不起,我的意思是它将运行一个循环,然后停止并删除?@HankPhung-我直到现在才意识到您的
setTimeout()
正在尝试调用
this.tick()
,这将设置另一个
setTimeout()
。但是,对
this.tick()
的调用将因显示的代码而失败。无论如何,请看我在回答中添加的更多解释。