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

tsa*_*vid 5 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;
  };
Run Code Online (Sandbox Code Playgroud)

你能帮我理解我是否需要使用.apply,如果有任何核心改进,我可以对这段代码做些什么?真的很感激帮助!

dwi*_*ern 7

正确性有一些明显的问题:

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

let add = memoize((a, b) => a + b)
add(1, 2)
> 3
add(1, 3)
> 3
Run Code Online (Sandbox Code Playgroud)

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

let log = memoize(() => console.log('hello'))
log()
> hello
log()
> hello
Run Code Online (Sandbox Code Playgroud)

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

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