思考:以下代碼在全局作用域中的執行結果是什麼?
for (var i = 0; i < 10; i++) {
setTimeout(function () {
console.log(i);
}, 0)
}
結果是:輸出十個 10
分析:js的定時器是一個單獨的線程,計時完成後將所要執行的任務添加到js引擎的任務隊列中去。
而外層的for循環執行速度非常快,當js引擎從任務隊列中取任務執行的時候,外層的for循環已經執行完畢,
且js沒有塊級作用域,因此js引擎執行console.log(i)的時候 i 已經變爲10了,因此輸出結果爲十個10
問題:那麼上面的代碼如何改進,使輸出 0 1 2 3 4 5 6 7 8 9 這種結果呢?
解決方案:利用閉包原理,創建匿名函數
for (var i = 0; i < 10; i++) {
(function (j) {
setTimeout(function () {
console.log(j);
},0);
})(i)
}
對於如何理解閉包,請參閱本系列前面的章節: 閉包原理