函数式编程风格中有一个“纯函数”的概念,纯函数是一种无反作用的函数,除此以外纯函数还有一个显著的特色:对于一样的输入参数,老是返回一样的结果。编程
在平时的开发过程当中,咱们也应该尽可能把无反作用的“纯计算”提取出来实现成“纯函数”,尤为是涉及到大量重复计算的过程,使用纯函数+函数缓存的方式可以大幅提升程序的执行效率。缓存
咱们能够建立一个独立的函数来记忆任何函数。咱们将此函数称为memoize。在传入相同的参数时直接返回上次缓存的结果,这样在计算大量有重复数据时,能够提供性能,闭包
function memoize(func) { const cache = {}; return function(...args) { const key = JSON.stringify(args) if(!cache.hasOwnProperty(key)) { cache[key] = func.apply(this, args) } return cache[key] } } function sum(n1, n2) { const sum = n1 + n2 console.log(`${n1}+${n2}=${sum}`) return sum } const memoizedSum = memoize(sum) memoizedSum(1, 2) // 会打印出:1+2=3 memoizedSum(1, 2) // 没有输出
memoizedSum在第一次执行时将执行结果缓存在了闭包中的缓存对象cache中,所以第二次执行时,因为输入参数相同,直接返回了缓存的结果。app
const memoize2 = fn => { const cache = new Map(); const cached = function(...val) { return cache.has(val) ? cache.get(val) : cache.set(val, fn.apply(this, val)) && cache.get(val); }; cached.cache = cache; return cached; };