Javascript 函数来缓存其参数';s返回值
我想编写一个函数Javascript 函数来缓存其参数';s返回值,javascript,memoization,Javascript,Memoization,我想编写一个函数一次,它接受回调作为输入并返回一个函数。当第一次调用返回的函数时,它应该调用回调并返回该输出。如果再次调用它,它将返回第一次调用时的输出值,而不是再次调用回调 下面是我尝试做的。但我没有得到我预期的结果。我需要理解这个概念 function once(func) { let num; function retFunc(x){ num = func(x); return num; } return retFunc;
一次
,它接受回调作为输入并返回一个函数。当第一次调用返回的函数时,它应该调用回调并返回该输出。如果再次调用它,它将返回第一次调用时的输出值,而不是再次调用回调
下面是我尝试做的。但我没有得到我预期的结果。我需要理解这个概念
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
,否则每次都会覆盖它:
函数一次(func){
让num;
函数retFunc(x){
num=(num===未定义)?func(x):num
返回num;
}
返回retFunc;
}
函数addByTwo(输入){
返回输入+2;
}
var onceFunc=一次(addByTwo);
console.log(onceFunc(4))//应该记录6
console.log(onceFunc(10))//应该记录6
console.log(onceFunc(9001))//应该记录6
您缺少的是在第一次执行后删除原始函数。您应按以下方式修改代码:
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
未定义时,您应该只分配num=func(x)
——也就是说,在第一次调用retFunc
时:
函数一次(func){
让num;
函数retFunc(x){
如果(num==未定义){
num=func(x);
}
返回num;
}
返回retFunc;
}
函数addByTwo(输入){
返回输入+2;
}
var onceFunc=一次(addByTwo);
console.log(onceFunc(4))//应该记录6
console.log(onceFunc(10))//应该记录6
console.log(onceFunc(9001))//日志6应采用不同的方法:覆盖对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
num
已经是一个很好的第一步,但是您怎么记得它已经被第一次调用了呢?你总是覆盖num=func(x)
FYI,这叫做哇,你在这里真的很有帮助,不是吗?难怪你有36.8krep@YangK主要是失眠!Hi通过添加if条件来检查num是否未定义我的代码现在正在工作。这是所需的行为-在输入1
时,函数returnsDefinedOn1
根据其名称返回未定义的。进一步调用onceFunc
也将返回undefined
,尽管调用的参数不是1
。请使用typeof
与undefined
@PierreArlaud在任何远程合理的代码中进行比较,我想这应该没有必要吧?许多全局对象可以重新定义,这并不意味着不应该使用它们,这意味着不重新分配它们。@如果未声明变量,CertainPerformance typeof也不会触发异常。在任何情况下,不使用typeof与undefined进行比较都不是更好的选择。我的观点是,使用typeof是一种很好的习惯,而“远程合理代码”也不例外。@PierreArlaud:在这种情况下,如果变量未声明,则获得异常是可取的,因为我们试图测试我们刚刚声明的变量的值,例外情况是我们在变量名中输入了一个错误,代码被破坏了。我想说的是,这种方法比依赖结果要好,因为函数不需要总是返回一些东西。它可能返回undefined,但我们仍然只希望运行一次。