關於for循環裏的計時器

也算是比較經典的面試題了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

相關文章
相關標籤/搜索