iT邦幫忙

0

JavaScript中的closure好難懂,它和匿名函式有什麼不同?

最近在看JavaScript的書,談到closure時有點丈二金剛摸不著頭緒。

請問一下它和匿名函式有什麼不同,有沒有什麼比較簡單易懂的說法,可以掌握住它的核心精神?

2 個回答

28
fillano
iT邦超人 1 級 ‧ 2008-03-31 16:26:10
最佳解答

在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則跟變數或函數定義的位置有關。)

18
chetbaker
iT邦新手 3 級 ‧ 2008-03-22 23:26:16

這裡這裡有一些資料可以參考。

我要發表回答

立即登入回答