微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Javascript 中,匿名函数是否保留对其包含的对象的强引用?

如何解决在 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 举报,一经查实,本站将立刻删除。