【问题标题】:Javascript closure questionsJavascript 闭包问题
【发布时间】:2010-04-18 02:43:00
【问题描述】:

当我阅读 Javascript: The Good Parts 一书时。下面这段代码看不懂:

我们可以通过制作一个 帮助我们记忆的功能 功能。记忆功能将 取一个初始的备忘录数组和 基本功能。它返回一个 管理备忘录的 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; 是没用的。如有错误请指正。

【问题讨论】:

标签: javascript closures


【解决方案1】:

这是一个有趣的代码 sn-p 阅读 :)

你可能知道memoization是存储一个函数的结果,这样下次调用这个函数时就不用计算答案了,直接查就可以了。

所以我们需要为接受一个 int 并返回一个 int 的斐波那契函数存储答案。

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)。这最终成为斐波那契函数。

所以当有人说“fibonacci(5)”时。他们真的叫“shell(5)”。关于闭包的重要部分是“基本”和“备忘录”已经绑定。

那么'shell'有什么作用呢?

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

【讨论】:

    【解决方案2】:

    语句memo[n] = result; 将新计算的数字存储在记忆数组或缓存中。 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-06-28
      • 1970-01-01
      • 2011-09-09
      • 2013-02-17
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多