js篇(隨時更新)

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

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

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)的面試官可能會繼續(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è)置為5 秒
    console.log(new Date, i);
}, 1000 * i);

雖然這樣確實可以達到要求,但并不完美
熟悉ES的可能很快就會想到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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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

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