清除闭包中的内存引用

时间:2013-04-18 08:37:49

标签: javascript jquery

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

enter image description here

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

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

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

...

//In dispose method of viewport
jQuery(document).off( "keydown", this.keydownProxy );
this.keydownProxy = null;

因此,您可以看到我正在删除事件以及使闭包引用所在的代理无效。

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

如果是因为在其他地方有一个松散的指针可以保持活着,还有其他任何方式我可以看到它来自Chrome的来源吗?

感谢您提供的任何指导。

0 个答案:

没有答案