记忆功能函数的实现原理
工作中常常会遇见计算量特别大的实现方法,但是每次调用都会重新计算,这样特别影响性能,让我们的页面很慢,甚至出现卡顿现象;那么今天咱们手动实现一个有记忆功能的函数,避免重复调用,并提高性能;
话不多说,直接上代码
// 计算圆的面积
function getArea (r) {
console.log(r, 'r')
return Math.PI * r * r
}
// 模拟memoize
function memoize (f) {
let cache = {}
return function () {
let key = JSON.stringify(arguments)
// 判断cache 中是否已经有key这个属性,
// 如果有直接调取cache[key] 的值
// 如果没有,则去调用f函数 - 即传递进来的getArea 函数
cache[key] = cache[key] || f.apply(f, arguments)
return cache[key]
}
}
let getAreaWithMemory = memoize(getArea)
console.log(getAreaWithMemory(5))
console.log(getAreaWithMemory(5))
console.log(getAreaWithMemory(5))
console.log(getAreaWithMemory(5))
你会发现,在计算圆的面积 函数(getArea )中只执行了一次,虽然计算圆的面积很简单,看不出有多大的效果,但是当遇见计算量特别大的问题时,我们这个原理依然可以用,能大大提升性能。