鍍金池/ 問答/HTML/ 如何理解這樣的一道題?(不要測試,留下你的分析過程與結(jié)果)

如何理解這樣的一道題?(不要測試,留下你的分析過程與結(jié)果)

如題詳述: 剛面試完,就來寫下了這樣一道題目,還沒有測試,也希望你不要測試,留下您的分析過程與答案

1、一切都是由我寫的一道使用reduce方法求和數(shù)組引起的:

var arr = [1,2,3];
arr.reduce((sum,value) => {
    return sum + value
},0)

2、但是被面試官在上面加了點東西,就有點懵逼了:

var arr = [1,2,3];
arr.reduce((sum,value) => {
    setTimeout(() => console.log(1), 0)
    return sum + value
},0)

我說,先輸出求和結(jié)果,再輸出1(個人理解不知道對錯,他也沒說多少。)


3、接著,他又在上面修改了,想了下還是保留我的答案

var arr = [1,2,3];
arr.reduce((sum,value) => {
    setTimeout(() => console.log(1), 1000)
    return sum + value
},0)

請問你們是怎樣分析與理解的....

回答
編輯回答
陪她鬧

個人理解:

arr.reduce 傳第二個參數(shù),所以會執(zhí)行arr.length 次, 也就是會執(zhí)行 arr.length次setTimeout, 此題如下:

const eventLoop = [];
const arr = [1,2,3]
arr.reduce((sum, value) => {
    eventLoop.push(() => console.log(1));
    return sum + value;
});

eventLoop.forEach(fn => fn())

不管時間多少,一直在reduce的線程中,所以都是輸出求和結(jié)果,在執(zhí)行setTimeout的回調(diào)

可能不對,哈哈哈

2018年6月20日 08:39
編輯回答
維他命

其實大概是考你執(zhí)行順序吧!不過已經(jīng)有大佬進行發(fā)言了,具體我就不太清楚了。如果沒有看到大佬說的優(yōu)先級,我會依據(jù)個人經(jīng)驗推論,既然他顯示結(jié)果,那么必然是返回后再執(zhí)行的,但如果它設(shè)了 setTimeout 事件,那么第二個,沒有延遲,會直接進行執(zhí)行。而第三個因為有延遲,會出現(xiàn)執(zhí)行完后,在第一次運行的延遲時間到了連續(xù)出現(xiàn)一的結(jié)果。

驗證后,大佬說的優(yōu)先級是沒錯的。

2017年9月20日 20:13
編輯回答
何蘇葉

第一個是6,沒什么說的。
第二個是先6,立刻后3個1。
第三個是先6,一秒后3個1。
面試官是想考js的eventloop,簡單的說就是事件的優(yōu)先級。具體叫哪個名詞記不清楚了,setTimeout的優(yōu)先級沒有順序執(zhí)行的代碼優(yōu)先級高。拿第二個來說,reduce第一次的時候,遇到了settimeout,把settimeout放到次優(yōu)先級的隊列里,然后第二次,第三次。當(dāng)reduce都執(zhí)行完畢,開始執(zhí)行次優(yōu)先級隊列的任務(wù)。第三個就更清楚了,執(zhí)行次優(yōu)先級隊列之前先等一秒。

2017年10月29日 18:52
編輯回答
毀與悔

第一個輸出6
第二個是先輸出6,然后輸出1,1,1
第三個是先輸出6,一秒后,再輸出1,1,1

這‘三個1’是有順序的,哪怕時間間隔很小(可能1ms都不到),但還是有順序的

2018年7月10日 09:24
編輯回答
久舊酒

這是關(guān)于時間循環(huán)的考察,你的代碼會在執(zhí)行棧中執(zhí)行,setTimeout會被放入任務(wù)隊列中。執(zhí)行的時候是要先運行執(zhí)行棧中的代碼,再將任務(wù)隊列中的代碼放到執(zhí)行棧中執(zhí)行。所以setTimeout會在之后輸出。

2017年12月19日 19:28
編輯回答
扯不斷

這需要分析啥?

很簡單吧?

  1. 你會
  2. 就是setTimeout執(zhí)行三次,因此稍后會輸出三個1
  3. 還是setTimeout執(zhí)行三次,因此稍后會輸出三個1, 但是時間在1000ms之后
2018年9月4日 10:57