在另一个函数中传递的函数参数

时间:2019-01-14 09:28:25

标签: javascript ecmascript-6

我在看有关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

在上面的备忘录功能中,{/ {1}}变量的定义/未来如何?有人可以帮我理解吗?

args

在调用中,看来const memoize = (fn) => { let cache = {}; return (...args) => { ... 只是传递的函数args中参数/参数的变量,但我无法确定上面代码块的原因和方式正在工作。

此外,此代码/设计模式是否有名称?

编辑,我已阅读有关lazy evaluationarguments的内容。但是,我不了解的部分是,memoize函数中的fn如何成为传递的函数...args的参数? fn对象或其余参数arguments是否仅代表当前函数...args的参数/自变量,即memoize参数?在这种情况下,fn是函数args[0]吗?

1 个答案:

答案 0 :(得分:1)

不要把它当作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