我有一个fn回忆录,其中fn由两个输入引用来回传:
let NewRefCursor = memoized(
(deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
(deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing我需要的行为是NewRefCursor(a, b) === NewRefCursor(a, b)。当a或b被垃圾收集时,游标也应该被垃圾收集。
refToHash是另一个回忆录函数,它使用WeakMap,以便仍然允许所看到的引用到GC。
NewRefCursor的回忆录要复杂得多,因为它使用两个参数来确定缓存命中,因此与WeakMap不兼容,因此将防止任何看到的引用被GC‘编辑。我对任何形式的欺骗都是开放的,将私有字段附加到输入对象、概率数据结构。这个漏洞需要解决。到目前为止,我唯一的解决方案是添加一个参数来记录缓存大小,并在每个应用程序的基础上对该参数进行调优。恶心。
发布于 2015-12-29 13:52:02
如果您创建了一个二级弱映射(在弱映射上存储弱映射),那么当第一级的obj被捕获时,就会失去整个第二级(当a被释放时,您就失去了b)。如果b是通用的,您将仍然有一个a的弱映射,只有在有另一对(a,什么)的情况下,它才会出现。这不是最好的实施,但我认为这就足够了:
function BiWeakMap() {
this._map = new WeakMap();
}
BiWeakMap.prototype.set = function(key1, key2, value) {
if (!this._map.has(key1)) {
this._map.set(key1, new WeakMap());
}
this._map.get(key1).set(key2, value);
return this;
};
BiWeakMap.prototype.has = function(key1, key2) {
return this._map.has(key1) && this._map.get(key1).has(key2);
};
BiWeakMap.prototype.get = function(key1, key2) {
return this._map.get(key1) && this._map.get(key1).get(key2);
};这个概念可以扩展到n级的解决方案.这能解决你的问题还是我遗漏了什么?
发布于 2017-06-08 19:58:35
参见https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的回忆录,它通过构建所有作为对象的参数的WeakMap索引,以通用的方式解决了这个问题。WeakMap索引将唯一的整数分配给对象,然后可以通过stringify将对象与其他参数放在一起。
https://stackoverflow.com/questions/34202895
复制相似问题