All Articles

Closer - JavaScript - 閉包

閉包Closer

  • 定義
    • Closer是一個採用內部函數時也可調用外層作用域變數的方法
      1. 具有訪問自己的、外部的、全域的變數
      2. 可以訪問自己及外部傳入的參數
  • 透過Curry機制的function就是Closer,目的是讓Function獲取擁有記憶,簡化各種運算
  • 經典例子Fibonacci數列
    const fibonacci = ()=> {
        let cache = {
            0: 0,
            1: 1
        };
        const __fibonacci = (n) =>{
            return typeof cache[n] === 'number'
                ? cache[n]
                : cache[n] = __fibonacci(n - 1) + __fibonacci(n - 2);
        };
    }
    var start  = new Date();
    var s = fibonacci();
    var result = s(10);
    var end    = new Date();
    console.log('fabonacci(%d) = %d, use time %dms.', 
                30, 
                result,
                end.getTime() - start.getTime());
  1. 最少硬幣找零問題
    const minCoinGive = (arr) => {
        cache = new Object;
        const totalMoney = (money) => {
            for (let n of arr) {
                let add = 0;
                while (money >= n && money > 0) {
                    money = money - n;
                    cache[n] = add += 1;
                }
            }
            return cache;
        }
    }
    let te = minCoinGive([50, 25, 10, 5, 1]);
    console.log(te(46))
  1. 背包問題
  2. 最常公共子序列
  3. 矩陣鏈相乘
  4. 圖形的全點對最短路徑
Published 21 Jun 2017