使用WeakMaps在Javascript中创建常规弱引用

16

我正在尝试使用WeakMaps做一个显而易见的事情:我想创建一个弱引用。具体来说,我想要一个事件监听器列表,但是又不想这个列表影响监听器的生命周期。

所以当我发现WeakMaps时,我非常兴奋,直到我发现它们只被用于满足一种(相当罕见的)用例,即扩展那些否则已经sealed的对象。我想不出我曾经想过要这样做的时候,但我总是需要监听器列表。

有没有可能以我没有想到的一些巧妙方式使用WeakMaps来实现这个功能呢?


1
只是好奇:您设想的是什么样的架构?谁持有事件监听器的引用并使其保持活动状态?在当前设计中,事件监听器执行副作用,这种方法行不通。 - Bergi
1
你试图解决什么实际问题?由于WeakMaps无法使用(请参见我的答案),我可能能够建议一些替代解决方案。 - Bergi
2
@dandavis -- 如果函数内包含任何闭包引用,它们可能会消耗大量资源。 - Michael Hays
1
操作其参数。返回结果。控制外部资源。我想函数在没有闭包的语言中做的事情是相同的。;-) @dandavis有一个很好的观点——如果您的处理程序没有闭包(也许它们在执行操作之前查找表格),那么保留函数列表的开销并不昂贵。当然,在不支持弱引用的语言中,这就是您应该做的事情。 - Michael Hays
1
我不是来争论的。我的评论是针对dandavis的,特别是函数可以并且确实会使用大量资源这一点。你似乎同意我的观点。所以我不确定你想对我表达什么观点。也许你本来想把你的原始评论发给dandavis? - Michael Hays
显示剩余6条评论
1个回答

15
不,使用WeakMaps创建弱引用是不可能的。WeakMaps不可迭代,使用它们时始终需要键。这是一个有意的决定(也在此处),以便垃圾回收不会影响程序的语义 - 这正是您所希望的。
真正的弱引用可能随着ES8而来,请参见此处那里的草案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接