雖然只是一小段菜鳥的學習筆記 , 不過還是希望看到的高手看到不足的時候幫忙指點~
一:代碼和執行過程
/** * http://blog.csdn.net/ruantao1989 * ==>July6 分析一下最簡單的閉包 */function a() { //==>從變數i和對象b的角度來說: 他倆本來是a中的局部變數.如果沒有閉包的話,會在a返回後被銷毀 var i = 0; function b() { alert( ++i ); //==>b能訪問到a中的變數i(範圍內) } return b;//==>1.函數a的傳回值,引用自身內部的函數}var c = a();//==>2.此時變數c就是函數a的傳回值:函數b()//==>至此,這個簡單的閉包構建完成: //1.變數c是對象b或者說函數b的引用(見圖); //2.函數a在return給c後理應被銷毀,但變數c扔持有a中對象b的引用,所以a不能被銷毀//3.變數i屬於a,記憶體中繼續生存,並執行其計數的功能//==>3.以下每次調用c(),i都會自加(目前這段代碼中也只有這麼一種辦法能操作i的值)c();c();c();
二:換個通俗說法翻譯一下:
起因:
1.對象a是公司裡的"開發部" ,裡邊有技術牛人b 和 和只會記編號的i 倆人.
2.c是公司裡最後一個項目,c項目需要"開發部門"的b同學來寫代碼,公司早就想把"開發部門"處理掉 這個項目完了就都開除
經過:
牛人b開始寫c項目中的代碼
結果:
1.所以a這個"開發部"托"員工"b的福,還不能被銷毀
2."開發部"的數數專員i更是幸運的托b的福能在"開發部"裡繼續混口飯吃,而且兢兢業業的執行他的工作:數數
三:舉個沒return正確的反例
function a() { var i = 10; function b() { alert( ++i ); } //return b; //==>不return b() ,而直接return i return i;}var c = a();alert(c);alert(c);//==>不管打多少次都是i的初始值(每次i都是新變數)