//每次循環會調用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