memoized
函数实现原理:使用一组参数初次调用函数时,缓存参数和计算结果,当再次使用相同的参数调用该函数时,直接返回相应的缓存结果。
function memoize(func, hasher) {
if (typeof func != 'function') {
throw new TypeError('Expected a function')
}
const memoized = function(key) {
const address = hasher ? hasher.apply(this, arguments) : key
const cache = memoized.cache
if (cache.has(address)) {
return cache.get(address)
}
console.log(address)
const result = func.apply(this, arguments)
memoized.cache = cache.set(address, result) || cache
return result
}
memoized.cache = new Map()
return memoized
}
add 2021/3/29 感谢评论区朋友提出的多个参数取key的问题,我的解决方案就是在原函数上添加一个
hasher
,具体用法在文章最后~
测试
function add (n) {
if(!n){
return 0
}
if(n===1){
return 1
}
return n + add(n-1)
}
为了明显看出效果,我把每次的key
打印了出来,现在我们就以add为例,看下效果
var added = memoize(add)
added(10)
第一次,控制台如下效果
可以看出打印出了key
的值,然后咱们进行第二次调用,结果如下所示:
这时候就没打印出key
的值了,因为他读了咱们的缓存,这也是memoized
作用~
以上就是单参的情况,下面是多参的处理方式,为了测试多参,重新在写个add函数:
function add (...params) {
var str = `${params}`
return str
}
var added = memoize(add, function() {
var args = [].slice.call(arguments)
return JSON.stringify(args);
})
added(10, 20, 30)
大家可以自行在控制台看输出结果,这里我就不贴图了~