基本概念
簡單講就是把函數(shù)的計算結果緩存起來。這個對于計算量大的遞歸調用,可以加快速度。比如階乘,斐波那契數(shù)組數(shù)組等。
第1次計算,還是耗時的,因為沒有緩存;從第2次開始,可以不經過計算,直接從緩存中拿結果,速度很快。
對于遞歸函數(shù),緩存的是最終結果,而不是中間過程。比如計算10的階乘,最終緩存的是10的階乘的結果。中間過程1 ~ 9的階乘結果不緩存。也就是調用10的階乘之后再調用9的階乘,還是算第一次計算。
實現(xiàn)代碼
文件名:memoize.js
const memoize = function(fn) {
const cache = {};
return function() {
const key = JSON.stringify(arguments);
var value = cache[key];
if(!value) {
console.log('新值,執(zhí)行中...'); // 為了了解過程加入的log,正式場合應該去掉
value = [fn.apply(this, arguments)]; // 放在一個數(shù)組中,方便應對undefined,null等異常情況
cache[key] = value;
} else {
console.log('來自緩存'); // 為了了解過程加入的log,正式場合應該去掉
}
return value[0];
}
}
module.exports = memoize;
測試代碼
文件名: memoize_test.js
const memoize = require('./memoize.js');
const log = console.log;
// 斐波那契數(shù)組
const fibonacci = (n) => {
return n < 2
? n
: fibonacci(n - 1) + fibonacci(n - 2);
};
const memoizeFibonacci = memoize(fibonacci);
log(memoizeFibonacci(45)); // 新值,執(zhí)行中...; 1134903170 // 等待時間比較長
log(memoizeFibonacci(45)); // 來自緩存; 1134903170
log(memoizeFibonacci(45)); // 來自緩存; 1134903170
log(memoizeFibonacci(45)); // 來自緩存; 1134903170
log(memoizeFibonacci(45)); // 來自緩存; 1134903170