记某次面试所遇到的一题——实现函数缓存
。
- 函数柯里化
- 组合函数
上述两种思维方式都可以实现函数的一个缓存功能,简而言之,就是把函数执行的结果缓存起来,在最后一次调用。
柯里化思想
简而言之就是闭包的一个经典应用,那么需要考虑以下几种情况
- 不知道调用次数的柯里化思想
- 已知调用次数的柯里化思想
现来分析第一种,未知调用次数的柯里化
例如
分析如下,我们只是肉眼所见第一次执行三次,第二次执行两次,第三次执行五次,次数不可控,也就对应入参不同而已。
解题思路
柯里化内部本就会返回一个函数执行,我们把每次函数执行的结果缓存起来,也就是下面这样
递归每一次执行结果,做一个数组的拼接,现在我们需要计算每一次执行结果的一个累加值,没错你猜对了,用的reduce,那么回到原题,我们返回的res是一个可执行函数,那么在JavaScript底层上,我们对一个函数进行输出,他会得到一个 f a(){}
,究其原理本身是调用了 toString
方法。
所以我们代码是
不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理
已知执行次数的柯里化思想
例如
第一次执行三次,第二次执行二次,第三次执行五次,所以我们柯里化需要接受一个次数的形参
在内部我们定义一个arr
与index
来记录与缓存当前函数执行结果与次数,当当前执行次数与形参执行次数相同的时候,我们就会累加当前的值,作为函数的一个返回值。
不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理
函数组合思想
实现函数组合,达到类似效果
不懂reduce实现机制的童鞋,详解JavaScript数组的reduce原理
测试
、