理解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(...);
});
有几件事我不明白。
- 此技术应保证
emailServer.send(...)
只会被调用一次。它是如何做到的? hasRun
的状态如何保存?
- 在
onceOnly(f)
中创建 returns f()
的函数有什么用吗?为什么我们不简单地做以下事情:
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
也被唯一引用并被记住.
我正在尝试理解函数式编程并看到了以下示例:
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)
中创建 returnsf()
的函数有什么用吗?为什么我们不简单地做以下事情:
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
也被唯一引用并被记住.