Ошибка диапазона: превышен максимальный размер стека вызовов - JavaScript - PullRequest
1 голос
/ 11 июля 2020

Я создаю функцию saveOutput, которая принимает функцию и строку. Затем saveOutput вернет функцию, которая ведет себя точно так же, как переданная функция, за исключением случаев, когда строка пароля передается в качестве аргумента. Когда это произойдет, возвращенная функция вернет объект со всеми ранее переданными аргументами в виде ключей и соответствующими выходными данными в виде значений.

Я думаю, что мой код ниже верен, но я сталкиваюсь с Range Error: Maxiumum call stack size exceeded, когда Я запускаю свой код.

   function saveOutput(inputFunc, string) {
      let obj = {};
      //inputFunc() accepts one args
      //string like a pwd
     return function inputFunc(input) {
        if (input === string) {
            return obj;
             } else {
            obj[input] = inputFunc(input);
            return inputFunc(input);
        }
      }
      //returns a fxn
      return inputFunc;
   }

    //Test cases
    const multiplyBy2 = function(num) { return num * 2; };
    const multBy2AndLog = saveOutput(multiplyBy2, 'boo');
    console.log(multBy2AndLog(2)); // should log: 4
    console.log(multBy2AndLog(9)); // should log: 18
    console.log(multBy2AndLog('boo')); // should log: { 2: 4, 9: 18 }

1 Ответ

3 голосов
/ 11 июля 2020

Вы дважды используете имя inputFunc. Возвращенная функция называется inputFunc, поэтому она затеняет функцию обратного вызова, переданную в качестве параметра. Возвращенная функция вызывает inputFunc, который является самим собой и вызывает бесконечную рекурсию, и в конечном итоге выдается ошибка «Превышен максимальный размер стека вызовов».

Чтобы исправить это, используйте другое имя или сделайте его анонимным в качестве имени в любом случае не нужен, вот рабочий код с некоторыми улучшениями:

function saveOutput(inputFunc, string) {
  let obj = {};

  return function (input) {                    // make it anonymous
    if (input === string) {
      return obj;
    }
                                               // improvement 1: the else block can be omitted here
    return obj[input] = inputFunc(input);      // improvement 2: no need to call inputFunc twice, just assign and return at the same time 
  }

  // the return statement here is never reached because there is a return right before it so just remove it
}

Подробнее о затенении переменных здесь: Пример затенения переменных в javascript

Демо:

function saveOutput(inputFunc, string) {
  let obj = {};

  return function(input) {
    if (input === string) {
      return obj;
    }

    return obj[input] = inputFunc(input);
  }
}

const multiplyBy2 = function(num) {
  return num * 2;
};
const multBy2AndLog = saveOutput(multiplyBy2, 'boo');
console.log(multBy2AndLog(2));
console.log(multBy2AndLog(9));
console.log(multBy2AndLog('boo'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...