了解 David Walsh 的 once 函数

Understanding David Walsh's once function

我在这里看到了 David Walsh 的 once 函数:

function once(fn, context) { 
    var result;

    return function() { 
        if(fn) {
            result = fn.apply(context || this, arguments);
            fn = null;
        }

        return result;
    };
}

// Usage
var canOnlyFireOnce = once(function() {
    console.log('Fired!');
});

canOnlyFireOnce(); // "Fired!"
canOnlyFireOnce(); // nada

我的问题是这里的 tracker 变量是什么?每次 canOnlyFireOnce() 被触发时 result 不会变成 null 吗?将 fn 设置为 null 的目的是什么?

fn 是跟踪它是否被调用的变量。你可以用更明确的额外变量这样写:

function once(fn, context) { 
    var result;
    var called = false;

    return function() { 
        if (!called) {
            result = fn.apply(context || this, arguments);
            called = true;
        }

        return result;
    };
}

我想设置fn = null可以释放一些内存,所以他也想在调用后这样做。那么为什么不也用它来记住电话呢。

这里的fn是tracker变量。 fn 变量保存匿名函数。在调用一次 canOnlyFireOnce 函数后,fn 变量获得一个新值“null”。现在 fn(匿名函数)不再可用于执行,这就是为什么您不会看到“被解雇!”的原因。再次留言。