函數式編程風格中有一個「純函數」的概念,純函數是一種無反作用的函數,除此以外純函數還有一個顯著的特色:對於一樣的輸入參數,老是返回一樣的結果。編程
在平時的開發過程當中,咱們也應該儘可能把無反作用的「純計算」提取出來實現成「純函數」,尤爲是涉及到大量重複計算的過程,使用純函數+函數緩存的方式可以大幅提升程序的執行效率。緩存
咱們能夠建立一個獨立的函數來記憶任何函數。咱們將此函數稱爲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; };