理解JS中的高阶函数:下面的代码如何保证代码只会被调用一次?

Understanding higher order functions in JS: how does the following code guarantee that the code will only be called once?

我正在尝试理解函数式编程并看到了以下示例:

function onceOnly(f) {
    var hasRun = false;
    return function() {
        if(!hasRun){
            hasRun = true;
            return f();
        }
    }
}

// Call as many times as you like
var sendWelcomeEmail = onlyOnce(function() {
    emailServer.send(...);
});

有几件事我不明白。

function onceOnly(f) {
    var hasRun = false;
    if(!hasRun){
        hasRun = true;
        return f();
    }
}

可以找到此代码的来源here

谢谢。

onlyOnce的目的是return一个函数,而不是调用一个函数。你的第二个例子是调用函数 return f.

的结果

然而,第一次实施

//return a reference to an anonymous function
var sendWelcomeEmail = onlyOnce(...);
//you can use it to call after
sendWelcomeEmail();

只需在 return f() 之前添加一个 console.log(),您就会看到不同之处。

hasRun 首先是 false。一旦 sendWelcomeEmail() 被调用,hasRun 将被设置为 true。由于 sendWelcomeEmail 被引用到一个匿名函数,它是唯一的并且存在于内存中,第二次调用同一个函数不会触发 f() 因为 hasRun 也被唯一引用并被记住.