Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数来缓存其参数';s返回值_Javascript_Memoization - Fatal编程技术网

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,但我们仍然只希望运行一次。