JavaScript中的弱可重用引用?
我正在尝试用JavaScript创建一个模式(标准库中可能存在一个模式,但我想实现自己的模式) 我需要一个弱引用的容器,以确保侦听器不会加载未使用的函数。我可以使用JavaScript中的弱可重用引用?,javascript,weak-references,Javascript,Weak References,我正在尝试用JavaScript创建一个模式(标准库中可能存在一个模式,但我想实现自己的模式) 我需要一个弱引用的容器,以确保侦听器不会加载未使用的函数。我可以使用WeakSet来执行此操作,但是WeakSet无法迭代,因此我无法为(让l进入侦听器)执行,并通知我的侦听器更改 我能做些什么来解决这个问题?在Lua、Java、C等其他语言中,我对此没有问题 我没有使用任何外部库 const makeObservable = function(obj, value) { // Must be
WeakSet
来执行此操作,但是WeakSet
无法迭代,因此我无法为(让l进入侦听器)执行,并通知我的侦听器更改
我能做些什么来解决这个问题?在Lua、Java、C等其他语言中,我对此没有问题
我没有使用任何外部库
const makeObservable = function(obj, value)
{
// Must be a container of weak references.
// But a weakset is not sufficient.
const listeners = new Set();
obj.addListener = function(listener)
{
listeners.add(listener);
};
obj.removeListener = function(listener)
{
listeners.remove(listener);
};
obj.setValue = function(newVal)
{
if (value === newVal) return;
const oldVal = value;
value = newVal;
for (let l of listeners)
{
// Notify all listeners of the change.
l(oldVal, newVal);
}
};
obj.getValue = function()
{
return value;
};
return obj;
};
const obs1 = makeObservable({ }, 5);
const obs2 = makeObservable({ }, 10);
(function()
{
const memory = { };
const lis = function(_, newVal)
{
memory.changed = newVal;
};
// Whenever either changes, update memory.
obs1.addListener(lis);
obs2.addListener(lis);
})();
// 'memory' is out of scope, but still has references pointing to it.
// I have no current way of removing the memory leak until obs1 and obs2 fall out of scope.
如果您可以迭代它,它就不是弱引用。您可能希望使用关键字“javascript cache npm”或类似的内容进行谷歌搜索。弱映射与缓存不同,需要根据LFU或LRU等条件手动对缓存进行垃圾收集。其他语言具有可移植的弱引用容器,如Lua(x=setmetatable({},{uuu mode=“k”})
或Java的WeakHashMap
。例如,LRU缓存不会删除超出范围的元素,只有在容器中添加新元素时才会删除。这只会减少内存泄漏,而不会消除内存泄漏。JS不支持这一点。@Hatefind其他语言有……JavaScript不是其他语言。Bergi是正确的。@PatrickRoberts Bergi有没有办法模仿它?