一直在尝试通过查看下划线文档并尝试编写我自己的更常用函数版本来了解有关函数式编程的更多信息。
越过“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,以及是否可以对此代码进行任何核心改进?真的很感激帮助!
答案 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
来检测缓存中是否存在某些内容。
我建议你写一个测试套件。在发现这些错误时,测试非常有价值。想想你的功能可能无法正常工作的其他边缘情况。像这样的独立实用程序非常适合测试驱动的编码。