假如现在有个纯函数(不依赖外部变量)
function getSum(a){
console.time('a')
var sum = a
for(var i = 0;i<1000000000;i++){
sum+=i
}
console.timeEnd('a')
return sum
}
执行时间高达 1944.754150390625ms
如果后面还要调用,又走了一遍,但结果还是一样的,那这一遍可以省略
Q:怎样省略这一步呢?
可以将第一遍执行的结果缓存起来,再次调用直接return第一遍的执行结果
Q:怎样缓存呢?
闭包
function memorize(fn) {
// 验证fn参数是否是函数
if(!(typeof fn === 'function')) {
throw new Error('传的不是函数')
}
var cache = {} // 执行结果缓存在cache
return function(){
// cache[参数] = 结果
var args = Array.from(arguments)
var str = args.join('-')
cache[str] = cache[str] || fn.apply(fn,arguments)
return cache[str]
}
cache = null // 防止内存泄露
}
现在重写getSum
var getSum = memorize(function(a){
console.log('执行getSum')
console.time('a')
var sum = a
for(var i = 0;i<1000000000;i++){
sum+=i
}
console.timeEnd('a')
return sum
})
改造后的getSum只有第一次调用时间长点,后面都是瞬间返回结果
如果有理解错误的地方,欢迎大佬指正。毕竟我只是条咸鱼