【问题标题】:Understanding input value in JavaScript memoized function理解 JavaScript 记忆函数中的输入值
【发布时间】:2014-07-20 06:16:03
【问题描述】:

我目前正在阅读 Douglas Crockford 的“Javascript:好的部分”,其中有一个示例演示了记忆化的概念。

var memoizer = function (memo, fundamental) {
  var shell = function (n) {
   var result = memo[n];
   if (typeof result !== 'number') {
     result = fundamental(shell, n);
     memo[n] = result;
   }
  return result;
  };
return shell;
};

var fibonacci = memoizer([0, 1], function (shell, n) {
   return shell(n - 1) + shell(n - 2);
});

我不明白的是,n 的值从何而来?

【问题讨论】:

标签: javascript memoization


【解决方案1】:

n 是一个输入。它不会“来自”您发布的代码中的任何地方,您必须为其提供一个值。

【讨论】:

  • 是的,我很清楚在调用时,函数 shell 会收到 n 值。但是,我对在此示例中何时传递 n 感到困惑。基本上,为了验证我没有失去理智。所以为了让它工作,我是否需要在某个时候调用 memoizer 函数?
  • @user2678538:他试图告诉你,在这个例子中没有传递n,因为你没有在任何地方调用fibonacci(尽管shell被调用了两次)。
【解决方案2】:

在代码var shell = function (n) 中,您指定当您调用函数shell 时,您将为它提供一个输入参数n。因此,如果您调用 shell(5)n 将等于 5,或者您传入的任何其他数字。

您需要查看每个函数调用中调用和返回的内容——fibonacci 设置为 memoizer 函数的返回值,memoizer 返回接收 @987654330 的 shell 函数@。因此,尽管在您的示例代码中从未调用过它,但最终您会调用fibonacci(5),其中 5 是您的n。只需按照函数调用和返回即可。

【讨论】:

  • 是的,我很清楚,在调用时,函数 shell 会收到 n 值。但是,我对在此示例中何时传递 n 感到困惑。基本上,为了验证我没有失去理智。所以为了让它工作,我是否需要在某个时候调用 memoizer 函数?
  • @user2678538:不,memoized 函数。在创建 fibonacci 函数时,您已经在调用 memoizer()
  • 您需要查看正在创建的内容——fibonacci 设置为memoizer 函数的返回值,memoizer 返回接收n 的shell 函数。所以最后你会打电话给fibonacci(5),其中 5 是你的n。只需按照函数调用和返回即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-07
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多