close

定義 :

在一個巢狀function的內部, child function使用到outter function的local var時, 會把local var綁著.
這時候如果inner function變成回傳值傳出去, 或者是被當作參數丟進去某個function中, 都會綁著這個Local var.

前情提要 : 

1. local var
    在一個function內, 用var xxx宣告的變數, 稱為local variable. 他的生命週期就在這個function的"{" 到 "}", 如果出了function還呼叫這個變數, 就會出現var不存在的錯誤訊息

    Note : 什麼不是local var => 
               a.  在最外層用var ooo宣告的變數, 其實他是window的成員變數
               b.  在function內部用this.xxx宣告的變數, 他是這個function被new起來之後的成員變數

2. 什麼是巢狀function
    function outter(){
      function inner(){

        }
 }
    
用法與時機 : 

      如果你要使用一個API, 但是這個API紙可以傳function, 卻沒有辦法傳參數進去的時候, 就可以用Closure的方式把變數傳進來

ex1 : 跑Clock, 把傳進來的i綁起來.

1.1 標準的巢狀function

function outter(i){
   function inner(){
       document.getElementById('clock').html = i;
       i = i *2;
   }
   setInterval(inner, 1000);

}
outter(1);

or 

1.2 inner是anonymous function

function outter(i){
   
   setInterval(function(){
       document.getElementById('clock').html = i;
       i = i *2; 
   }, 1000);

}
outter(1);

or

1.3 比較常見的closure寫法, inner被當成function傳出去

function outter(i){
   return function(){
       document.getElementById('clock').html = i;
       i = i *2;
   }
   
}

setInterval(outter(1), 1000);

 ex2 : jquery的queue() and dequeue()
 
 參考這篇 http://minglight.pixnet.net/blog/post/37899609 先研究一下queue()的用法

 基本上就是使用queue的setter, 而運用上跟setInterval()是一樣的, 差別在於queue()你可能會放一些不同參數的function進來, 而這就是Closure美妙的地方, 你可以儘管綁架你想要的各式各樣的local var, 但是對queue()來說, 傳進來的只是個無參數的function, 他要做的只是執行他而已.



  


 

 

arrow
arrow
    全站熱搜

    minglight 發表在 痞客邦 留言(0) 人氣()