手写一个记忆化函数

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
}
上一篇下一篇

猜你喜欢

热点阅读