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
這段代碼有兩個特色:安全
一、函數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閉包》