我有一个关于闭包如何与垃圾收集相关的问题。我创建了一个 javascript 应用程序,它似乎在不断添加在我创建新项目时没有被清理的对象。在我的代码中,应用程序清除了对新创建对象的所有引用,我确保取消绑定所有事件并释放它们。但是,当我查看 chrome 堆分析器时,我看到的是:
当我单击对象的引用时,我可以看到 jQuery 代理函数中有指向对象的指针。(特别是变量“上下文”)
从我所见,代理函数创建了一个闭包,并且该闭包在构造时具有对视口的引用。这就是我在 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 中来自哪里?
感谢您提供的任何指导。