閉包的應用-cache 機制

比較少見的例子。

簡述

大部分的閉包都是以「私有 / 公開方法」來舉例。cache 的例子我覺得還蠻少見的,所以特別記一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function complex (num) {
console.log('Calculating');
return num * num * num;
}

function cache (fn) {
const ans = {};
return function (num) {
// 如果 ans 裡面找的到就直接回傳
if (ans[num]) {
return ans[num];
}
// 找不到就執行傳進來的 fn 求出結果
return ans[num] = fn(num);
}
}
const cacheComplex = cache(complex);
console.log(cacheComplex(20)); // 只有第一次會出現 Calculating
console.log(cacheComplex(20));
console.log(cacheComplex(20));

總之呢,每次執行 cacheComplex 其實就是執行在 cache 裡的那個匿名函式,它會有兩條路:

  1. 如果閉包裡的 ans[num] 有值就直接回傳
  2. 如果沒有,就執行閉包裡的 fn,進行複雜計算

重點在於不管 call 幾次 cacheComplex 它們都能共用同一個 ansfn 的資訊。

mentor-program-day83 從 ECMAScript 來理解閉包與作用域的原理
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×