理解閉包、同步、異步的最好例子


//每次循環會調用setTimeout函數,其中指定了一個timeout后執行的函數
//這個函數因為構成閉包的關系,其能夠訪問外層函數定義的變量,這個變量就是i
//在for循環執行完畢后,i的值為10.此時在事件隊列中有10個timeout函數等待執行
//當timeout時間到時,對應的執行函數調用的i都是同一個,也就是10
for(var i=0;i<10;i++){ setTimeout(function() { console.log(i); }, 1000); } //10 輸出10次10
//在for循環中定義了匿名立即執行函數
//通過將每次循環時產生i傳入匿名立即執行函數,立即執行函數就有了一個內部變量e,
//其值是傳入的i
//setTimeout函數形成閉包,能訪問到其外層函數也就是匿名立即執行函數的變量e
//因為e引用關系的存在,匿名立即執行函數不會被馬上銷毀掉
//timeout時間一到,指定執行函數調用的e就是每次傳入的參數i
for(var i=0;i<10;i++){
(function(e) { setTimeout(function() { console.log(e); },
1000); })(i); } //0~9
//整個和上面的類似,只不過把匿名立即執行函數傳遞給setTimeout的第1個參數中
//匿名立即執行函數,顧名思義就是需要立即執行的呀。
//所以setTimout函數對應的超時執行函數(第1個參數)
//為匿名立即執行函數執行的結果,也就是返回的函數。
//接下來理解就和上面一樣啦
for(var i=0;i<10;i++){   
setTimeout((function(e) { returnfunction() { console.log(e); } })(i),
1000) } //0~9
//第一個for這樣寫也能得到0~9:
for(let i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);  
    }, 1000);
}
//ECMAScript6的let和const見   http://es6.ruanyifeng.com/#docs/let

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM