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