一條有趣的前端面試題(1)

以下是幾種for循環(huán)輸出代碼


1. 代碼一

for (var i = 0; i < 5; i++) {
  console.log(i);
}

這幾行代碼的結(jié)果是直接輸出0~4


2.代碼2

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
}

因為SetTimeOut會延遲執(zhí)行,所以執(zhí)行到consolo.log()的時候i已經(jīng)變成了5,所以結(jié)果是開始輸出一個5,然后隔一秒輸出一個5,一共5個5


3.代碼3

for (var i = 0; i < 5; i++) {
(function(i){
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
  })(i)
}

因為閉包每次執(zhí)行,并每次都帶有參數(shù)i,所以輸出的結(jié)果是先輸出一個0,然后分別隔一秒輸出2,3,4


4.代碼4

for (var i = 0; i < 5; i++) {
(function(){
  setTimeout(function() {
    console.log(i);
  }, 1000 * i);
  })(i)
}

因為閉包內(nèi)部沒有保存對參數(shù)i的引用,所以結(jié)果是開始輸出一個5,然后隔一秒輸出一個5,一共5個5


5.代碼5

    for (var i = 0; i < 5; i++) {
        setTimeout((function() {
            console.log(i);
        })(i), 1000 * i);
    }

這里給SetTimeout傳遞了一個立即執(zhí)行函數(shù),SetTimeout可以接受函數(shù)或者字符串作為參數(shù),但是參數(shù)為立即執(zhí)行函數(shù),相當于underfind

SetTimeout(相當于underfind,1000*i);

所以輸出的結(jié)果為:立馬輸出0~4


6.代碼6

    setTimeout(function() {
        console.log(1)
    }, 0);
    new Promise(function executor(resolve) {
        console.log(2);
        for (var i = 0; i < 10000; i++) {
            i == 9999 && resolve();
        }
        console.log(3);
    }).then(function() {
        console.log(4);
    });
    console.log(5);

首先setTimeout,會先設(shè)置一個定時,在定時結(jié)束后將傳遞這個函數(shù)放到任務(wù)隊列里面,因此開始肯定不會輸出1。然后是一個Promise,里面的函數(shù)是直接執(zhí)行的,因此應(yīng)該直接輸出 2 3 。然后,Promise的then應(yīng)當會放到當前tick的最后,但是還是在當前 tick 中。因此,應(yīng)當先輸出 5,然后再輸出 4 。最后在到下一個 tick,就是 1 。"2 3 5 4 1"

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容