還記得之前面試時,幾乎快要每家的 javascript 都問到了 closure 使用的地方與觀念。
簡單來說,利用 closure 方法,我們可以做出類似私有變數(private)或是延續變數存活域。
看以上這句,一定一點也不懂XD
由例子來看吧!
假設我們現在想做一個 counter ,每呼叫一次 add() ,就把 count+1
因此可能會寫出如下的程式碼
[javascript] var count=0;
function add() { count++; } [/javascript]
這樣的寫法,當我們與其他程式碼放在一起時,可能會有其他開發人員誤改到 count 這個變數。
但我們也不可能寫成
[javascript] function add() { var count=0; count++; } [/javascript]
因此,我們可以利用 closure 嘗試做出類似 C++ 或 java class 的私有域(private)。
[javascript] var init=function(init) { return function(){ return init+=1; }; };
var add=init(0); [/javascript]
這以上可以看到,我們其實間接的延長了 init 的存活域,使他保留在函式私有域中。
以上這段程式碼,可能有人問為什麼要多一個 init 函式,其實這邊可以使用 IIFE(Immediately Invoked Function Expression)簡化。
我們其實可以使用 IIFE 寫成下面這樣
[javascript] var add=(function(init) { return function(){ return init+=1; }; })(0);
[/javascript]
參考資料: