setTimeout()是js中的一類重要函數,將一段代碼延遲必定時間並異步執行。可是這個函數常常不聽話。在實踐中,可能常常有人碰到相似下面的這種狀況:面試
for (var i = 1; i <= 2; i++) { setTimeout(function() { alert(i) }, 100); }
咱們指望的結果是,先隔100毫秒彈出1,再隔100毫秒彈出2。可是跑起來後,alert的兩次內容都是數字3,並且緊挨着輸出,並非本身所指望的先1後2。有一種很基礎的面試題是,如何合理改動代碼,使它返回指望的結果?異步
其實很簡單。在stackoverflow上早有大神解釋了,能夠參考這個連接函數
答案翻譯成中文以下(並作了部分修改方便理解):oop
---------------------------------------------------------------------------------spa
你要爲每一個定時器處理函數建立不一樣的「i」變量副本。好比這樣:翻譯
function doSetTimeout(i) { setTimeout(function() { alert(i); }, 100); } for (var i = 1; i <= 2; ++i) doSetTimeout(i);
function doScaledTimeout(i) { setTimeout(function() { alert(i); }, i * 5000); }
(100毫秒超時,效果不會很明顯,因此我設置的數字高達5000)code
「i」值乘以基礎延遲值,因此循環5次將致使分別延遲5秒,10秒,15秒,20秒,和25秒。blog