浅聊缓存函数
前文,我们已经聊过了:柯里化函数、偏函数,根据高阶函数的定义:
高阶函指使用其他函数作为参数、或者返回一个函数作为结果的函数。
柯里化函数、偏函数,都是妥妥的高阶函数!传入一个原函数,返回一个新函数。新函数继承了原函数的能力,又发展出不同的新能力!!
牛哇牛哇,初级前端开发,用函数封装过程,高级前端开发,用函数封装函数。
本篇再介绍一个新的高阶函数 —— 缓存函数
什么是缓存函数?什么情况下需要用到缓存函数?
本篇将用以下这个场景来解释:
比方说,我们这里有一个非常耗时的计算函数:
遍历数字 100 亿,需耗时 10s +,打印出这个值;
问:有什么办法能够缓存下来这个值,等到下次再次调用 calculate(10_000_000_000)
的时候,不需要再次进行计算,直接就输出这个计算结果??
有人说:着还不简单吗,直接把结果付给一个变量,let result = calculate(10_000_000_000)
,下次直接拿 result
的值不就行了吗?
从实现上讲,当然是可以的;不过,从设计模式的角度来讲,就不太 ok 了!
为什么?
因为声明 result
变量作为一个全局变量要一直存在,不管未来你用或者不用,它都存在着,占用着内存;
设想下,如果有 N 个大数的计算,要写 N 个变量去存吗?即使有一些是后面不会再重复被调用了的。
又有朋友说了:“我有好主意”!
我直接声明一个缓存对象,再改写 calculate
函数内部,计算的时候判断一下,算过了的,就从对象里面拿,没算过的,才会进行计算。
代码如下:
本瓜不得不说:你这孩子打小就聪明!
但是,忘记开闭原则了吗?我们尽量要少修改原函数,而是尽量在其基础上去拓展它。
这次是 calculate
函数需要缓存,下次,可能是 balculate
或 dalculate
,难道还要去改这些函数的内部判断吗?
当然不!!缓存函数就是来解决这种困境的!!
代码如下:
计算结果,就已经被缓存到 cashedCalculate
里面了,我们再次调用:
会立即得到计算结果 !
小结:
哈哈,就是这样巧妙的思路,如果问缓存函数的究极奥义是啥?
本瓜会答:是闭包!闭包太强了,用 cached 函数处理 calculate 的时候,就留下了一个闭包对象 cacheObj ,一直被存储着。并且返回的是回调函数,一样去接收后续的参数。
这样,既避免了多次创建全局变量,也避免了多次修改原函数内部。
用函数封装函数,高级!!
OK,以上便是本篇分享。点赞关注评论,为好文助力👍
我是掘金安东尼 🤠 100 万阅读量人气前端技术博主 💥 INFP 写作人格坚持 1000 日更文 ✍ 陪你一起度过漫长岁月 🌏
版权声明: 本文为 InfoQ 作者【掘金安东尼】的原创文章。
原文链接:【http://xie.infoq.cn/article/6821970acfdf3e5a92c0cc57b】。文章转载请联系作者。
评论