Функция для кэширования возвращаемого значения аргумента

Я хочу написать функцию 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

Ответ 1

Вы должны назначать num = func(x) тогда, когда num не 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

Ответ 2

Вы должны только вызывать функцию и присваивать 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

Ответ 3

Что вам не хватает, так это удаление исходной функции после первого выполнения. Вы должны изменить свой код следующим образом:

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

Таким образом, вы удаляете функцию после первого использования и сохраняете результат.

Ответ 4

Это твоя проблема

function retFunc(x){
        num = func(x);
        return num;
    }

Ты всегда func(x). Добавьте условие if, чтобы проверить, является ли num undefined перед вызовом func(x).

Ответ 5

другой подход: переписать вызов 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