js篇(隨時(shí)更新)

1、一道關(guān)于閉包和定時(shí)器的面試題
for (var i = 0; i < 5; i++) {
    setTimeout(function() {
        console.log(new Date, i);
    }, 1000);
}
console.log(new Date, i);

很多人可能快速的掃過(guò)代碼,覺(jué)得答案是0,1,2,3,4,5
其實(shí)并不然,仔細(xì)看下代碼會(huì)發(fā)現(xiàn),循環(huán)過(guò)程中,幾乎同時(shí)設(shè)置了5個(gè)定時(shí)器,這些定時(shí)器都會(huì)在1
s后觸發(fā),所以答案應(yīng)該是立即輸出一個(gè)5,1s后輸出5個(gè)5
如果遇見(jiàn)這種題,面試官一般會(huì)追問(wèn)了,怎么輸出5 - >0,1,2,3,4,基本大家都會(huì)想到,閉包

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

當(dāng)然,還有另外的解決方法,我們只要每次拿到循環(huán)體內(nèi)部的i值就可以

var output = function (i) {
    setTimeout(function() {
        console.log(new Date, i);
    }, 1000);
};

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

變態(tài)的面試官可能會(huì)繼續(xù)刁難,那么輸出0 -> 1 -> 2 -> 3 -> 4 -> 5喃?

for (var i = 0; i < 5; i++) {
    (function(j) {  // j = i
        setTimeout(function() {
            console.log(new Date, j);
        }, 1000*j);
    })(i);
}
setTimeout(function() { // 額外增加定時(shí)器,設(shè)置為5 秒
    console.log(new Date, i);
}, 1000 * i);

雖然這樣確實(shí)可以達(dá)到要求,但并不完美
熟悉ES的可能很快就會(huì)想到Promise

const tasks = [];   // 這里存放所有異步的 Promise
const output = (i) => new Promise((resolve) => {
    setTimeout(() => {
        console.log(new Date, i);
        resolve();
    }, 1000 * i);
});
 
// 生成全部的異步操作
for (var i = 0; i < 5; i++) {
    tasks.push(output(i));
}
 
// 異步操作完成之后,輸出i
Promise.all(tasks).then(() => {
    setTimeout(() => {
        console.log(new Date, i);
    }, 1000);
});
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,938評(píng)論 25 709
  • 同事說(shuō):“xx地方的民工太不講究了,數(shù)對(duì)夫妻住工棚,晚上用簾子隔開(kāi)就是一間臥室,這怎么住呢?......” “xx...
    嗅梅閱讀 749評(píng)論 7 5
  • 有人的地方,便有江湖! 宮廷、市井、江湖……到底那里才是江湖,還是這一切,凡是有人的地方都是江湖。宮廷的詭異跌宕,...
    幽憂子3閱讀 489評(píng)論 2 7
  • 風(fēng)過(guò)紅楓擺 徒留離人淚 已是又一年 風(fēng)過(guò)落楓只聞雁聲 滄桑歲月無(wú)情今又是 只留我獨(dú)自世間行 舉筆無(wú)語(yǔ)憂愁擾 淚如雨...
    拿什么拯救地球閱讀 455評(píng)論 0 0

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