【问题标题】:Understanding higher order functions in JS: how does the following code guarantee that the code will only be called once? [duplicate]理解JS中的高阶函数:下面的代码如何保证代码只会被调用一次? [复制]
【发布时间】:2021-11-29 08:57:15
【问题描述】:

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

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(...);
});

对此我有一些不明白的地方。

  • 这种技术应该保证emailServer.send(...) 只会被调用一次。它是如何做到的? hasRun 的状态如何保存?
  • onceOnly(f) 中创建一个返回f() 的函数有什么用处?为什么我们不简单地执行以下操作:
function onceOnly(f) {
    var hasRun = false;
    if(!hasRun){
        hasRun = true;
        return f();
    }
}

这段代码的来源可以找到here

谢谢。

【问题讨论】:

标签: javascript functional-programming higher-order-functions


【解决方案1】:

onlyOnce 的目的是返回一个函数,而不是调用一个函数。你的第二个例子是调用函数并返回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也被唯一引用并被记住了。

【讨论】:

  • 我明白了,这是因为sendWelcomeEmail 在内存中持有对hasRun 的引用,如果我理解正确的话?这意味着 hasRun 在更改后将被保存。
  • 可以,只要匿名函数还存在。 hasRun 仍在使用并在内存中被引用
猜你喜欢
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 2023-03-30
  • 2018-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多