如何解决在 Javascript 中,匿名函数是否保留对其包含的对象的强引用?
假设一个变量 foo
包含一个对象,一个匿名函数返回它,并且存在一个对 foo
的弱引用:
let foo = { bar: 3 }
let af = function () {
return foo
}
let ref = new WeakRef(foo)
目前,ref
仍在引用对象。而我现在要做的是将 foo 设置为 null
并强制调用 GC。 (通过使用 --js-flags="--expose-gc" 运行 Chrome 并使用 window.gc()
方法。):
foo = null
gc()
因此,对象 { bar: 3 }
没有被 GC 处理。 (通过调用 ref.deref()
进行检查)因此,起初,我确信匿名函数具有强引用。但是,我去了 here,并且能够找到以下内容:
WeakRef
可能永远不会从 undefined
返回 deref
,即使没有任何东西强持有目标,因为垃圾收集器可能永远不会决定回收该对象。
然后我想垃圾收集器可能已经跳过了对对象的GC。所以我在 kotlin 上做了同样的测试:
class Obj {}
var foo: Obj? = Obj()
val af = { foo }
val ref = WeakReference(foo)
foo = null
system.gc()
在 kotlin 中,对象 Obj()
完全被垃圾回收。但我仍然不确定,因为两种语言根本不同,我不知道Javascript引擎是否肯定有GC。我也尝试过使用 V8 运行时方法 (%CollectGarbage(true);
) 但还是一样。
那么,在 Javascript 中,匿名函数是否对它所包含的对象保持强引用?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。