memoize – 返回 memoized(缓存的)函数

本文介绍memoized函数的工作原理,通过缓存参数及其计算结果来提高重复调用同一组参数时的效率。文中提供了实现示例及单参数和多参数场景下的测试案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

大家可以自行在控制台看输出结果,这里我就不贴图了~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值