首页 > 解决方案 > 缓存其参数返回值的函数

问题描述

我想编写一个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

标签: javascriptmemoization

解决方案


您应该只分配num = func(x)when numis 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));


推荐阅读