垃圾收集关闭规则与Javascript

aug*_*hey 7 javascript garbage-collection

我有一个程序,它使用Javascript作为绑定到更大的C++应用程序的脚本语言.我可以互换地使用V8和webkit,但底层运行时对于这个问题并不重要.

在这个应用程序中,我有动态创建的对象将接收回调.我会像这样创建这个回调绑定...

function f() {
  var obj = CreateNewCallbackObj();
  obj.onCallback = dowork; // dowork is a function
}
Run Code Online (Sandbox Code Playgroud)

很明显,这会产生GC问题,因为obj已超出范围,最终将被删除.

我想要的是对象自我管理它的生命周期.该对象最终会收到一个回调,它将指示其生命的结束,当发生这种情况时,它可以自行删除.

一个想法是通过添加obj.myself = obj来自我引用.这似乎是错误的方法,但它可能会工作,除非垃圾收集算法是聪明的.

有没有正确的方法来做到这一点?没有构建用于存储对象的基础持久性DOM,所有JS对象都根据需要动态分配,但需要某种方式在JS引擎中保留.

小智 7

自我引用并不能保证任何东西都能保持活力.事实上,没有自我尊重的GC'd语言(我知道)只使用refcounting.甚至不要想到滥用GC算法或任何其他实现定义的细节 - 这种方式就是疯狂.

至于替代方案:创建一些总是可到达的(例如全局)对象,该对象包含所有这些对象(从而使它们保持活动状态)并提供删除对象的方法.然后祈祷没有其他人得到参考 - 甚至更好,不要担心这一点.GC的重点是你不应该(必须)知道/关心何时释放内存.

您还可以添加一个alive属性,在所有方法的开头检查它,并在调用方法时引发错误!this.alive- 当然,这不是保证,但它可能有助于调试.