JavaScript中的弱可重用引用?

JavaScript中的弱可重用引用?,javascript,weak-references,Javascript,Weak References,我正在尝试用JavaScript创建一个模式(标准库中可能存在一个模式,但我想实现自己的模式) 我需要一个弱引用的容器,以确保侦听器不会加载未使用的函数。我可以使用WeakSet来执行此操作,但是WeakSet无法迭代,因此我无法为(让l进入侦听器)执行,并通知我的侦听器更改 我能做些什么来解决这个问题?在Lua、Java、C等其他语言中,我对此没有问题 我没有使用任何外部库 const makeObservable = function(obj, value) { // Must be

我正在尝试用JavaScript创建一个模式(标准库中可能存在一个模式,但我想实现自己的模式)

我需要一个弱引用的容器,以确保侦听器不会加载未使用的函数。我可以使用
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有没有办法模仿它?