手写一个记忆化函数
2020-03-01 本文已影响0人
BitterOutsider
基本需求
若某一函数已经执行过一次,则再次执行时无需运行,可直接拿到结果。
这里实现一个单参数的简单形式。
效果如下:
const fn = memo((x) => {
console.log('执行了一次')
return x * 2
})
fn(1) // 执行了一次 2
fn(1) // 2
fn(1) // 2
fn(2) // 执行了一次 4
实现
分析:fn 还能执行,说明 memo 返回的是一个函数,且传入的参数用于执行函数。我们可以在 memoed 中创建一个对象来存储传入的参数并对比此参数以前是否传入过。
const memo = function(){
const memoed = function(param){
if(!(param in memoed.cache)){
memoed.cache[param] = fn.apply(this, arguments)
}
return memoed.cache[param]
}
memoed.cache = {}
return memoed
}