閉包(Closure)的基本概念

閉包(Closure)的基本概念:

閉包(Closure)算是在Javascript中比較高階的應用了,不過它基礎其實也不算太難懂。只是用起來很可以複雜XD。閉包其實也是函式,不過它比較特的的是它擁有一組特殊的環境變數--本來以為應該消失,可是卻依然存在的變數。在Mozilla的MDN中對閉包的解釋:

" A closure is a special kind of object that combines two things: a function, and the environment in which that function was created",閉包是個特殊的物件,他包含了一個函式,以及函式被建立時所在的環境。所謂的環境是:" 環境由任意的局域變數所組成,這些變數是由在閉包建立的時間點上存在於作用域裡的所有變數"。有些難懂,不過沒關係,繼續往下看看例子。

閉包(Closure)的形成:

<script type="text/javascript">
function closure_test(){
var x="Welocme to Javascript";
return function (){alert (x);}
}
var y =closure_test();
y();
</script>

這範例沒啥特別的,只是傳回的值是一個函式。這函式還存取了函式本身所在的作用域中的變數x。仔細看這x,x因為在函式closure_test()中,照理講,當呼叫完closure_test()後就該消失。可是,神奇的是範例中的y()函式依然能使用該變數。現在跟上邊講的合在一起, x就是那個以為該消失卻沒消失的變數。closure_test()的函式作用域就是上面提到的"環境",所以函式y()+環境就是所謂的閉包。

換個方法說,其實閉包就意味著函式有個保護罩,用來保護函式所要使用的變數不會被系統給釋放掉。

閉包(Closure)的使用:

這範例會建立一個對使用者說出特定訊息的函式。

<script type="text/javascript">
function showmsg(msg){ return function (user){return user+"注意:"+msg;} } 
var y =showmsg("有人舉報你使用非法程式"); 
var z =showmsg("請回答下列問題"); 
document.writeln(y("維克")); 
document.writeln("<br/>"); 
document.writeln(z("維克")); 
document.writeln("<br/>"); 
document.writeln(y("騎豬飛上天")); 
document.writeln("<br/>"); 
document.writeln(z("騎豬飛上天")); 
document.writeln("<br/>"); 
</script>

輸出:

維克注意:有人舉報你使用非法程式
維克注意:請回答下列問題
騎豬飛上天注意:有人舉報你使用非法程式
騎豬飛上天注意:請回答下列問題

其他:

如果你想更了解其他函式觀念,可以參考看看下面這篇文章:函式 Function

我把許多函式的觀念與用法都收集在這篇文章內。

關於閉包的其他文章:

閉包(Closure)的細節:共用與非共用變數

閉包(Closure)的細節(二):模擬私有變數

閉包(Closure)的細節(三):閉包與記憶體洩漏

閉包(Closure)的細節(四):閉包效能與prototype

 
 

  按個讚!~支持本站!~

FB推薦載入中