閉包函式

beiyuxinke發表於2016-04-14

閉包函式又稱繫結函式,一個顯著的特徵是,當函式在不在它所處的變數作用範圍時,仍然可以使用本地變數。

(1)作為值從另一個函式中返回。(作為值從函式返回的函式都是閉包函式)

function A(){
 var temp = "local temp";
B = function(){
 alert(temp);
}
return B;
}

var myFunc = new A();
myFunc();
如上述程式碼段所示,temp作為本地變數,myFunct位於函式的作用域外部,按理來說,並不能呼叫temp。

但在這段程式碼中,實際上是可以使用的,這就是閉包函式。

(2)利用變數作用範圍也可以產生閉包函式。

var F;
function A(){
   var temp = "local temp";
    F = function(){
      alert(temp);
   }
}

A();
F();
在本例中,F函式仍然可以呼叫本地變數temp.但是F所處的環境中其他程式並不能呼叫這個變數。

總的來說,閉包函式的核心就是,函式能夠在任何時候,任何環境下訪問函式在定義時的私有變數,這個私有變數在函式被呼叫的環境中是不能直接訪問的。


閉包函式的應用:匿名自執行函式

想要理解閉包函式,首先必須理解js中的函式作用域和作用域鏈問題。

關於函式作用域,這裡有一篇很好的文章:http://blog.csdn.net/yueguanghaidao/article/details/9568071


舉個例子

<pre name="code" class="javascript">for(var i = 0; i < 10; i ++){
  setTimout(function(){
     alert(i);
},1000);
}


在這段程式碼中,作用鏈是function匿名函式-> setTimeout函式->window, 匿名函式的i值在該函式中並沒有被定義,因此需要向上一級作用域尋找。又因為在第一次執行setTimeout函式之前,for迴圈肯定已經完成了,因此,此時i的值為10。

所以這段程式碼的輸出結果會alert 十次數字10.





相關文章