[基礎] Javascript函數的閉包

閉包:一個可使用另一個函數做用域中的變量的函數。

以下面的代碼函數b就是閉包,可是這個前提是:當函數a的內部函數b被函數a外的一個變量引用的時候,就建立了一個咱們一般所謂的「閉包」。

意思是說b要變成閉包的話,就必須被外包所引用,即c引用:
<script type="text/javascript">
function a(){
   var i=1;
   function b(){
       ++i;
      return i;
   }
  return b;
}
var c=a();
alert(c());
</script>
用一個專業一點的說法就是:函數調用返回後一個沒有釋放資源的棧區;

閉包造成的緣由:內存釋放問題

通常,當函數執行完畢後,局部活動對象會被銷燬,內存中僅保存全局做用域,但閉包的狀況是不同的。

閉包的活動對象依然會保存在內存中,因而像上例中,函數調用返回後,變量i是屬於活動對象裏面的,就是說其棧區尚未釋放,但你調用c()的時候i變量保存的做用域鏈從b()->a()->全局去尋找做用域var i聲明所在,而後找到了var i=1;而後在閉包內++i;結果,最後輸出的值就是2了;

不知道這麼說有沒人明白,若是不明白,那麼只要記住它的閉包的兩個點就行了, 一點就是閉包的活動對象沒有被銷燬;第二點是做用域鏈的關鍵是他要遇到var 聲明;就行了····


下面是,阮一峯http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html?20120612141317#comments對閉包的解析;

閉包會攜帶它的函數的做用域,所以會比其餘函數佔用更多的內存,因此使用閉包要很是注意!!! javascript

相關文章
相關標籤/搜索