JavaScript中的弱可迭代引用?

时间:2018-05-21 17:58:43

标签: javascript weak-references

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

我需要一个弱引用容器,以确保侦听器不会保留未使用的函数。我可以使用WeakSet来执行此操作,但是WeakSet无法迭代,因此我无法执行for (let l in listeners)并通知我的听众更改。

我该怎么做才能解决这个问题?在其他语言中,例如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.

0 个答案:

没有答案