首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Javascript的垃圾收集闭包规则

使用Javascript的垃圾收集闭包规则
EN

Stack Overflow用户
提问于 2011-03-28 02:41:30
回答 1查看 1.5K关注 0票数 7

我有一个程序,它使用Javascript作为脚本语言绑定到一个更大的C++应用程序。我交替使用V8和webkit,但是底层的运行时应该与这个问题无关。

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

代码语言:javascript
复制
function f() {
  var obj = CreateNewCallbackObj();
  obj.onCallback = dowork; // dowork is a function
}

显然,这会有GC问题,因为obj已经超出范围,最终将被删除。

我想要的是让对象自我管理其生命周期。该对象最终将收到一个回调,该回调将发出生命结束的信号,当发生这种情况时,它可以删除自己。

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

有没有正确的方法来做这件事?没有构建用于存储对象的底层持久化DOM,所有JS对象都是根据需要动态分配的,但需要一些方法留在JS引擎中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-28 02:54:34

自我引用并不能保证任何东西都活着。事实上,没有一种有自尊的GC语言实现(据我所知)只使用了拒绝计数。甚至不要想着滥用GC算法或任何其他实现定义的细节-那样才是疯狂的。

至于替代方案:创建一些始终可达(例如,全局)的对象,它包含所有这些对象(并因此使它们保持活动状态),并提供一个删除对象的方法。然后祈祷没有其他人得到推荐信--或者更好的是,不要担心这个。GC的全部意义在于,您不应该(必须)知道/关心内存何时释放。

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5451426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档