最近在看JavaScript的書,談到closure時有點丈二金剛摸不著頭緒。
請問一下它和匿名函式有什麼不同,有沒有什麼比較簡單易懂的說法,可以掌握住它的核心精神?
在wikipedia看到的定義是,在function中定義的function,內部的function可以存去外部function內定義的變數,這樣叫做Closure。
這個我想在呼叫setInterval/setTimeout時最常用吧。你可以把在函數a內定義的函數b傳給setInterval執行,而這個丟給setInterval執行的函數b,仍然可以存取定義在a中的變數,這樣就是Closure。例如:
<pre class="html" name="code">
function test() {
var _tid = null;
var _count = 0;
this.a = function () {
_tid = setInterval(b,300);
}
function b() {
if(_count>3) {
clearInterval(_tid);
_count = 0;
} else {
alert("round: " + _count);
_count++;
}
}
}
var a = new test();
a.a();
把在test函數中定義的b函數丟給setInterval執行,它在執行時仍然可以存取定義在test函數中的變數_tid跟_count。
(可以做出Closure是javascript具備的能力,但是細部的規則還是javascript規格所定義的scope rule。另外一個要注意的事情是用this時要小心,this跟scope的規則不太一樣,不能把它當作區域變數。this是函數被呼叫時依照被呼叫的環境決定的,scope則跟變數或函數定義的位置有關。)