Javascript关闭问题

时间:2010-04-18 02:43:00

标签: javascript closures

我正在阅读Javascript:The Good Parts这本书。我无法理解下面的代码:

  

我们可以通过制作一个来概括这一点   帮助我们记忆的功能   功能。记事本功能将   拿一个初始的备忘录数组和   基本功能。它返回一个   管理备忘录的shell函数   商店和那称之为根本   根据需要运作。我们通过了shell   功能和功能参数   基本功能:

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;
};
     

我们现在可以定义斐波那契了   memoizer,提供初始备忘录   数组和基本功能:

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

我的问题是什么是测试功能?什么时候定义和调用?这对我来说似乎很困惑。我也认为这句话:memo[n] = result;没用。如果我错了,请纠正。

2 个答案:

答案 0 :(得分:4)

这是一个有趣的代码片段:)

您可能知道memoization正在存储函数的结果,因此下次调用该函数时,它不必计算答案,它可以查找它。

因此我们需要存储带有int并返回int的fibonacci函数的答案。

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

使用初始备忘录数组调用memoizer,映射fib(0) - > 0和fib(1) - > 1.

其余的定义了一个带有函数和数字的未命名函数。 'test'是一个坏名字,它应该是“recursive_fibonacci_helper”:)

这个未命名的函数成为“基本”参数。 memoizer函数返回一个带有int参数的函数(shell)。这最终成为斐波纳契函数。

所以有人说“斐波那契(5)”。他们真的称之为“shell(5)”。关闭的重要部分是“基本”和“备忘录”已经受到约束。

那么'shell'会做什么?

它在备忘录表中查找它是否已经为此输入计算了答案。如果它看到答案(=='数字'),则返回它。否则计算它并将其存储在备忘录表中。 memo[n] = result实际上是将计算结果存储在memoization表中。

答案 1 :(得分:1)

语句memo[n] = result;将新计算的数字存储在memoization数组或缓存中。 test函数是要记忆的函数的参数,由memoizer定义和传递。调用时,它会检查要计算的值是否已被缓存。如果是这样,它将从缓存中返回它。否则它会再次重新计算。

执行完所有上述代码后,我们在内存中得到类似的内容(但memo数组和orig_fibonacci已封装):

var memo = [0, 1];

function fibonacci(n) {
  var result = memo[n];
  if (typeof result != 'number') {
    result = orig_fibonacci(n);
    memo[n] = result;
  }
  return result;
}

function orig_fibonacci(n) {
  return fibonacci(n - 1) + fibonacci(n - 2);
}