函式在呼叫時,會建立 Scope 與 閉包,那什麼是閉包呢?
我們知道變數宣告只會在 Scope 內可以存取,以外是不能存取的。
閉包是當 function 呼叫時,會去記憶當下呼叫執行時 Scope 內的狀態。
這樣講一定很模糊先來看範例:
var countCreate = function () {
var count = 0;
return function () {
count++;
console.log(count);
}
}
var count1 = countCreate();
count1() // 1
count1() // 2
這是很簡單計數器的範例,countCreate
在呼叫之後,return
一個 function,呼叫之後會在 +1
看完之後有一個很奇怪的地方是,count1
照理說 function 呼叫完不是就結束了不會記錄 var count
的狀態啊, 理想上應該每次呼叫 count1 應該都要是 1,但結果不是為什麼,因為剛剛提到 function 建立時會產生閉包,所以會記錄當下的 count 到記憶體,所以在你每次 call count1
這個 function 中的 count 會從剛剛建立的閉包記憶體中去連接之前的狀態。