Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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_Jquery - Fatal编程技术网

Javascript 清除闭包中的内存引用

Javascript 清除闭包中的内存引用,javascript,jquery,Javascript,Jquery,我有一个关于闭包如何与垃圾收集相关的问题。我创建了一个javascript应用程序,它似乎在不断地添加在我创建新项目时无法清理的对象。在我的代码中,应用程序清除了对新创建对象的所有引用,我确保解除所有事件的绑定并处理它们。但是,当我查看chrome堆分析器时,我看到的是: 当我单击对象的引用时,我可以看到jQuery代理函数中有指向对象的指针。(特别是变量“context”) 从我所看到的,代理函数创建了一个闭包,该闭包在构建时引用了视口。以下是我在Viewport3D中使用代理的方式: //

我有一个关于闭包如何与垃圾收集相关的问题。我创建了一个javascript应用程序,它似乎在不断地添加在我创建新项目时无法清理的对象。在我的代码中,应用程序清除了对新创建对象的所有引用,我确保解除所有事件的绑定并处理它们。但是,当我查看chrome堆分析器时,我看到的是:

当我单击对象的引用时,我可以看到jQuery代理函数中有指向对象的指针。(特别是变量“context”)

从我所看到的,代理函数创建了一个闭包,该闭包在构建时引用了视口。以下是我在Viewport3D中使用代理的方式:

//in constructor of Viewport3D
this.keydownProxy = jQuery.proxy( this.onKeyDown, this );
jQuery(document).on( "keydown", this.keydownProxy );

因此,正如您所看到的,我正在删除事件,并在存在闭包引用的地方取消代理

那么为什么viewport3d仍然存在于内存中,即使在事件被删除并且代理无效之后,我知道这是代码的那一部分,因为当我注释掉所有创建的代理时,类被完全垃圾收集

如果这是因为其他地方有一个松散的指针使其保持活动状态,那么有没有其他方法可以让我在Chrome中看到它的来源


感谢您提供的指导。

我不太清楚到底发生了什么,但这可能与所描述的问题类似吗?嗨,贝特鲁特,我以前确实读过那篇文章。这实际上不是问题所在,因为我没有将jQuery代理绑定到单独的事件系统。我使用代理是因为它应该在jQuery环境中使用(至少在我看来是这样)。我已经完成了“off”函数,它肯定是在删除事件侦听器。然而,在我看来,即使我取消了代理,它仍然相信它在内存中被使用。因此,视口永远无法删除,因为代理“context”变量仍然包含对viewport3D的引用:这就是为什么我认为/认为它可能不会删除内存,因为在上下文之外的其他地方仍然存在对viewport3D的引用。但是看看堆分析器,这似乎并不像报道的那样。就探查器而言,对Viewport3D的唯一引用是Viewport3D拥有并已作废的代理中的引用:SMy认为
这个。onKeyDown
是jQuery之外的函数引用,但我不确定,这是不是Ben N的问题?Mat,你已经测试了我的理论。持续的时间很好。还有几件事你可以试试。(1) 在视口的dispose方法中,使用delete而不是等同于
null
;ie
删除此.keydownProxy。(2) 在Viewport3D的构造函数中,使用javascript的
.call()
,而不是jQuery的
.proxy()
;ie
var=this;jQuery(document).on(“keydown”,function(evt){that.onKeyDown.call(that,evt);})
,然后在dispose方法中单独使用
…off(…)
行(不带delete或=null)。
//In dispose method of viewport
jQuery(document).off( "keydown", this.keydownProxy );
this.keydownProxy = null;