要理解閉包首先要知道什麼是函數的做用域鏈緩存
由於有函數的做用域鏈存在,因此函數不管在哪裏調用,函數均可以使用函數外部做用域的變量。閉包
當一個函數被調用時,會建立一個執行環境及相應的做用域鏈。而後使用arguments和其餘命名參數的值來初始化函數的活動對象。此活動對象在當前函數做用域鏈的第一位,外部函數的活動對象在做用域鏈的第二位,外部函數的外部函數的活動對象在第三位,直至做爲做用域鏈終點的全局執行環境。函數
閉包的做用:spa
實現一個做用域,達到封裝的目的,這樣作的好處是隱藏私有變量,防止污染全局變量;code
還能夠實現緩存功能對象
1 案例1:隱藏私有變量 2 3 function pack() { 4 5 var index; 6 7 return function () { 8 9 return index++; 10 11 }; 12 13 } 14 15 16 17 var p = pack(); 18 19 p(); 20 21 22 23 案例2:緩存 24 25 function createFab(n) { 26 var _cache = {}; 27 return function (n) { 28 var result = 0; 29 if (_cache[n]) { 30 return _cache[n]; 31 } 32 if (n === 1 || n === 2) { 33 result = 1; 34 } 35 else { 36 result = fab(n - 1) + fab(n - 2); 37 } 38 _cache[n] = result; 39 return result; 40 } 41 } 42 43 44 var fab = createFab(); 45 console.info(fab(6)); 46 console.info(fab(6));