javascript閉包

 1 function a()
 2 {
 3   var strnum =0;
 4   function b(){
 5       alert(strnum+1);
 6     }
 7  return b;  
 8 }
 9 var result=a();
10   result(); // 1
View Code

這段代碼有兩個特色:安全

  一、函數b嵌套在函數a內部;閉包

  二、函數a返回函數b。ide

使用閉包的注意函數

1)因爲閉包會使得函數中的變量都被保存在內存中,內存消耗很大,因此不能濫用閉包,不然會形成網頁的性能問題,在IE中可能致使內存泄露。解決方法是,在退出函數以前,將不使用的局部變量所有刪除。性能

2)閉包會在父函數外部,改變父函數內部變量的值。因此,若是你把父函數看成對象(object)使用,把閉包看成它的公用方法(Public Method),把內部變量看成它的私有屬性(private value),這時必定要當心,不要隨便。spa

閉包執行的過程.net

函數a和b互相引用但又不被外界打擾(被外界引用),函數a和b就會被GC回收。code

整個函數a從定義到執行的步驟就完成了。此時a返回函數b的引用給result,又函數b的做用域鏈包含了對函數a的活動對象的引用,也就是說b能夠訪問到a中定義的全部變量和函數。函數b被result引用,函數b又依賴函數a,所以函數a在返回後不會被GC回收。對象

閉包的應用場景blog

  一、保護函數內的變量安全。以最開始的例子爲例,函數a中i只有函數b才能訪問,而沒法經過其餘途徑訪問到,所以保護了i的安全性。

  二、在內存中維持一個變量。依然如前例,因爲閉包,函數a中i的一直存在於內存中,所以每次執行c(),都會給i自加1。

  以上兩點是閉包最基本的應用場景,不少經典案例都源於此。

 

摘自《深刻理解Javascript閉包

相關文章
相關標籤/搜索