有another question要求相同,但我无法理解已接受的答案。
所讨论的库似乎使用Object.defineProperty
添加对要存储的对象的引用(尽管间接通过另一个对象)。
但是...肯定会因为这个链接而导致对象无法被垃圾回收吗?
我想念什么?
真的有可能创建一个对象并将其存储在某个地方而无需保持垃圾回收器可以注意到的引用吗? (ES2015之前)
接受的答案:
我花了一段时间查看代码,但后来又打了我:关键
本身用于存储对该值的引用。
例如,设置几层
defProp(obj,globalID,{value:store}); defProp在哪里
定义为Object.defineProperty,obj为键,globalID为
guid和store是包含值的存储对象。
然后进入获取值
obj [globalID];
这很聪明。 WeakMap实际上没有包含参考
到任何东西(弱或其他)-它只是设定了在哪里
秘密地存储价值。使用Object.defineProperty意味着
您不会偶然发现价值存储的-您必须知道
神奇的向导来查找它。
由于键直接指向值(而WeakMap不会
引用),当所有对键的引用都消失时,它将被GC化
像平常一样。
The library in question。
最佳答案
当然,这是否意味着由于该链接而无法对对象进行垃圾回收?
是。
我想念什么?
没有。也许这正是期望的行为。
正如答案所解释的那样,“ WeakMap实际上不包含对任何东西(弱或其他)的引用”和“当所有对键的引用都消失了时,它像正常情况一样被GC化”。
关于javascript - 如何在ES5中实现弱图?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44389863/