Переданные параметры функции внутри другой функции - PullRequest
0 голосов
/ 14 января 2019

Я просматривал статью о функции memoize в JavaScript и наткнулся на приведенный ниже пример

// same memoize function from before
const memoize = (fn) => {
  let cache = {};
  return (...args) => {
    let n = args[0];
    if (n in cache) {
      console.log('Fetching from cache', n);
      return cache[n];
    }
    else {
      console.log('Calculating result', n);
      let result = fn(n);
      cache[n] = result;
      return result;
    }
  }
}
const factorial = memoize(
  (x) => {
    if (x === 0) {
      return 1;
    }
    else {
      return x * factorial(x - 1);
    }
  }
);
console.log(factorial(5)); // calculated
console.log(factorial(6)); // calculated for 6 and cached for 5

Как описана / определена переменная args в приведенной выше функции memoize? Может ли кто-нибудь помочь мне понять это?

const memoize = (fn) => {
  let cache = {};
  return (...args) => {
...

Из вызова кажется, что args - это просто переменная для аргументов / параметров переданной функции fn, но я не могу понять, почему и как работает приведенный выше блок кода.

Кроме того, есть ли название для этого кода / шаблона проектирования?

Редактировать Я прочитал о аргументах и остальных параметрах . Однако часть, которую я не понимаю, состоит в том, почему функция ...args inside memoize становится параметрами из переданной функции fn? Не должен ли arguments объект или параметр покоя ...args представлять только параметры / аргументы из текущей функции memoize, т.е. аргумент fn? И в этом случае args[0] это функция fn?

1 Ответ

0 голосов
/ 14 января 2019

Не путайте это с аргументами того, что fn магическим образом передается в возвращаемой функции. Вы правы, понимая функции и возможности.

Если я рефакторинг кода, это выглядит так.

const memoize = () => {
  //just renamed the returned function to somefn
  return somefn(); 
}

const somefn = (...args) => {
// somefn takes x as argument when we called factorial(x)
  let cache = {};
  let n = args[0];
  if (n in cache) {
    console.log('Fetching from cache', n);
    return cache[n];
  }
  else {
    console.log('Calculating result', n);
    let result = foo(n);
    cache[n] = result;
    return result;
  }
}

//your business logic is in foo now
const foo = (x) => {
  if (x === 0) {
    return 1;
  }
  else {
    return x * factorial(x - 1);
  }
}

const factorial = memoize(foo);

console.log(factorial(5)); // calculated
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...