缓存其参数的 return 值的函数
Function to cache its argument's return value
我想编写一个接受回调作为输入的函数 once
并且 return 是一个函数。当第一次调用 returned 函数时,它应该调用回调和 return 输出。如果它被调用任何额外的时间,而不是再次调用回调,它只会 return 第一次调用时的输出值。
以下是我尝试做的事情。但是我没有得到预期的结果。我需要理解这个概念。
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
这是你的问题
function retFunc(x){
num = func(x);
return num;
}
您总是在呼叫 func(x)
。在调用 func(x)
.
之前添加一个 if 条件来检查 num
是否为 undefined
你应该只调用函数并赋值 num
如果它是未定义的,否则你每次都会覆盖它:
function once(func) {
let num;
function retFunc(x) {
num = (num === undefined) ? func(x) : num
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
请注意,如果您传入的函数 returns undefined
将被多次调用。如果您需要处理这种情况,您可以设置一个标志来指示缓存值是否有效。
您缺少的是在第一次执行后删除原始函数。您应该按以下方式修改您的代码:
function once(func) {
let num;
function retFunc(x){
if (func)
num = func(x);
func = null;
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
为 undefined
时分配 num = func(x)
- 也就是说,在 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));
不同的方法:覆盖对 func 的调用
没有标志,检查结果是否未定义或是否需要任何东西
function once(func) {
let num;
let internalFn = function(x) {
num = func(x);
internalFn = function(x) {
return num;
}
return num;
}
function retFunc(x){
return internalFn(x);
}
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
我想编写一个接受回调作为输入的函数 once
并且 return 是一个函数。当第一次调用 returned 函数时,它应该调用回调和 return 输出。如果它被调用任何额外的时间,而不是再次调用回调,它只会 return 第一次调用时的输出值。
以下是我尝试做的事情。但是我没有得到预期的结果。我需要理解这个概念。
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
这是你的问题
function retFunc(x){
num = func(x);
return num;
}
您总是在呼叫 func(x)
。在调用 func(x)
.
num
是否为 undefined
你应该只调用函数并赋值 num
如果它是未定义的,否则你每次都会覆盖它:
function once(func) {
let num;
function retFunc(x) {
num = (num === undefined) ? func(x) : num
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
请注意,如果您传入的函数 returns undefined
将被多次调用。如果您需要处理这种情况,您可以设置一个标志来指示缓存值是否有效。
您缺少的是在第一次执行后删除原始函数。您应该按以下方式修改您的代码:
function once(func) {
let num;
function retFunc(x){
if (func)
num = func(x);
func = null;
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
为 undefined
时分配 num = func(x)
- 也就是说,在 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));
不同的方法:覆盖对 func 的调用
没有标志,检查结果是否未定义或是否需要任何东西
function once(func) {
let num;
let internalFn = function(x) {
num = func(x);
internalFn = function(x) {
return num;
}
return num;
}
function retFunc(x){
return internalFn(x);
}
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