javascript - 缓存其参数返回值的函数
问题描述
我想编写一个once
接受回调作为输入并返回函数的函数。第一次调用返回的函数时,它应该调用回调并返回该输出。如果再次调用它,它不会再次调用回调,而是简单地返回第一次调用时的输出值。
下面是我试图做的。但我没有得到我预期的结果。我需要理解这个概念。
function once(func) {
let num;
function retFunc(x){
num = func(x);
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
解决方案
您应该只分配num = func(x)
when num
is undefined
- 也就是说,在第一次调用时retFunc
:
function once(func) {
let num;
function retFunc(x){
if (num === undefined) {
num = func(x);
}
return num;
}
return retFunc;
}
function addByTwo(input){
return input + 2;
}
var onceFunc = once(addByTwo);
console.log(onceFunc(4)); //should log 6
console.log(onceFunc(10)); //should log 6
console.log(onceFunc(9001)); //should log 6
但这不是一个有保证的通用解决方案 - 如果传递的函数(addByTwo
在您的示例中)在调用时导致结果如何?undefined
然后,=== undefined
检查将不起作用。因此,最好设置一个标志或类似的东西,并在第一次调用回调时重新分配该标志:
function once(func) {
let num;
let done = false;
function retFunc(x){
if (!done) {
done = true;
num = func(x);
}
return num;
}
return retFunc;
}
function returnsUndefinedOn1(input){
return input === 1 ? undefined : input;
}
var onceFunc = once(returnsUndefinedOn1);
console.log(onceFunc(1));
console.log(onceFunc(10));
console.log(onceFunc(9001));
推荐阅读
- javascript - 在视频的右下角添加内部 div
- regex - 正则表达式:在两个单引号之间获取第二个字符串
- javascript - 将类添加到加载到页面中的元素
- javascript - 以角度从数组中检索值
- hibernate - 有什么方法可以从存储库中的 Spring Security 获取当前 userId?
- html - Bootstrap 4 固定和粘性标题
- python - plt.gca() 与我的图表一起打开一个空白画布
- python - 如何使用计时器更新 axvline?
- awk - 从每个文件中提取相同的列到一个文件
- vue.js - SVG 在 Safari 上的绘制方式不同