在 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 (将#修改为@)