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,如果有任何核心改进,我可以对这段代码做些什么?真的很感激帮助!
正确性有一些明显的问题:
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来检测缓存中是否有某些内容.
我建议你写一个测试套件.在发现这些错误时,测试非常有价值.想想你的功能可能无法正常工作的其他边缘情况.像这样的独立实用程序非常适合测试驱动的编码.
| 归档时间: |
|
| 查看次数: |
6178 次 |
| 最近记录: |