在下划线中实现和理解“memoize”功能lodash

时间:2015-09-12 20:14:06

标签: javascript memoization

一直在尝试通过查看下划线文档并尝试编写我自己的更常用函​​数版本来了解有关函数式编程的更多信息。

越过“memoize” - 我无法绕过它,并在Crockford的'The Good Parts'中找到了一些信息。

  _.memoize = function(func) {
    // 'cache' object is used to hold the result of the memoized fn's call
    var cache = {};
    var recur = function(n) {
      var result = cache[n];
      if (typeof result === 'undefined') {
        result = func.apply(this, arguments);
        cache[n] = result;
      }
      return result;
    }
    return recur;
  };

请问您能否理解我是否需要使用.apply,以及是否可以对此代码进行任何核心改进?真的很感激帮助!

1 个答案:

答案 0 :(得分:7)

正确性存在一些明显的问题:

1)您只根据 first 参数的值缓存结果,因此调用具有不同参数的函数会产生错误的结果!

let add = memoize((a, b) => a + b)
add(1, 2)
> 3
add(1, 3)
> 3

2)您使用undefined来表示尚未调用的函数,但undefined是有效的返回值。看看副作用如何发生两次:

let log = memoize(() => console.log('hello'))
log()
> hello
log()
> hello

您可以使用cache.hasOwnProperty来检测缓存中是否存在某些内容。

我建议你写一个测试套件。在发现这些错误时,测试非常有价值。想想你的功能可能无法正常工作的其他边缘情况。像这样的独立实用程序非常适合测试驱动的编码。