V8需要声明HandleScope才能清除在作用域内创建的任何Local句柄.我知道HandleScope将取消引用这些句柄进行垃圾收集,但我很感兴趣为什么每个Local类都不会像大多数内部ref_ptr类型的助手那样自行解除引用.
我的想法是,HandleScope可以通过一次性转储大量句柄而不是像在ref_ptr类型作用域类中那样逐个转储来更有效地完成它.
我有一个程序,它使用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引擎中保留.