实现函数缓存(柯里化&&组合函数)

550 阅读2分钟

记某次面试所遇到的一题——实现函数缓存

  1. 函数柯里化
  2. 组合函数

上述两种思维方式都可以实现函数的一个缓存功能,简而言之,就是把函数执行的结果缓存起来,在最后一次调用。

柯里化思想

image.png

简而言之就是闭包的一个经典应用,那么需要考虑以下几种情况

  1. 不知道调用次数的柯里化思想
  2. 已知调用次数的柯里化思想

现来分析第一种,未知调用次数的柯里化

例如

image.png 分析如下,我们只是肉眼所见第一次执行三次,第二次执行两次,第三次执行五次,次数不可控,也就对应入参不同而已。

解题思路

image.png

柯里化内部本就会返回一个函数执行,我们把每次函数执行的结果缓存起来,也就是下面这样

image.png 递归每一次执行结果,做一个数组的拼接,现在我们需要计算每一次执行结果的一个累加值,没错你猜对了,用的reduce,那么回到原题,我们返回的res是一个可执行函数,那么在JavaScript底层上,我们对一个函数进行输出,他会得到一个 f a(){},究其原理本身是调用了 toString方法。 所以我们代码是

image.png 不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理

已知执行次数的柯里化思想

例如

image.png 第一次执行三次,第二次执行二次,第三次执行五次,所以我们柯里化需要接受一个次数的形参

image.png 在内部我们定义一个arrindex来记录与缓存当前函数执行结果与次数,当当前执行次数与形参执行次数相同的时候,我们就会累加当前的值,作为函数的一个返回值。

image.png 不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理

函数组合思想

image.png 实现函数组合,达到类似效果

image.png 不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理

测试

image.png

image.png

下面我们来做一题编程题:

image.png