也算是比較經典的面試題了html
for(var i=0;i<5;i++){ console..log(i) }
//0,1,2,3,4面試
for (var i = 0; i < 5; i++) { console.log(i, "for"); setTimeout(function() { console.log(i, "interval"); }); } console.log('同步')
//打印出這個順序,這是主要是由於JS的運行機制有關,因爲是單線程的運行機制,也就是說,你們都排隊吧,第一個結束,第二個跟上。閉包
也就是說,第一我的不結束,第二個就一直等着。。。這樣乾等也不是個辦法,因此設計者就考慮到了,那第一個沒結束,就把等待中的任務給掛起,而後繼續第二個任務,直到等待中的任務有返回結果了,再繼續等待中的任務。異步
這裏就要分同步任務和異步任務了,貼了一下某位coder的blog,他寫的很接地氣:https://www.cnblogs.com/hahazexia/p/9446585.htmlspa
來講一下上面打印的順序,按順序執行,for循環是同步任務,首先執行,接下來遇到計時器,是異步任務,放到隊列後面,而後往下執行console.log('同步’),這時候開始執行剛纔放到任務隊列最後的計時器,當計時器執行的時候 i 這個變量,已經變成了5,因此會打印出5.線程
接下來第三段代碼,須要再計時器裏打印出0,1,2,3,4設計
for (var i = 0; i < 5; i++) { console.log(i, "for"); (function(i) { setTimeout(function() { console.log(i, "interval"); }); })(i); } console.log("同步");
聰明的你確定已經想到了,用了一個閉包,改變了做用域,這時候每一次循環裏,i的值都會被儲存起來。code
for (var i = 0; i < 5; i++) { console.log(i, "for"); (function(i) { setTimeout(function() { console.log(i, "interval"); }, i * 1000); })(i); } console.log("同步");
這裏就是間隔一秒打印一個數htm