1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
首先建議題主看一篇關(guān)于JavaScript文章
JavaScript Event Loop運(yùn)行機(jī)制詳解
這篇文章詳細(xì)闡述了JavaScript事件輪詢的原理
下面來(lái)說(shuō)說(shuō)題主的問(wèn)題:
1、主線程會(huì)先執(zhí)行,當(dāng)執(zhí)行到test()的時(shí)候兩個(gè)setTimeout會(huì)同時(shí)被放進(jìn)任務(wù)隊(duì)列,然后執(zhí)行alert(0),所以首先輸出 0,此時(shí)a的值是19,因?yàn)閟etTimeout還沒(méi)執(zhí)行,a沒(méi)有其他賦值機(jī)會(huì);
2、主線程執(zhí)行完畢然后輪詢?nèi)蝿?wù)隊(duì)列執(zhí)行定時(shí)任務(wù),由于第一個(gè)setTimeout時(shí)間較第二個(gè)短,因此首先執(zhí)行第一個(gè)setTimeout的回調(diào),此時(shí)約1s后alert(a)會(huì)輸出上一步的19,然后a被賦值為5;
3、接著便執(zhí)行第二個(gè)setTimeout,因?yàn)閮蓚€(gè)setTimeout同時(shí)被放進(jìn)隊(duì)列里面,所以這里大約會(huì)在2s后執(zhí)行第二個(gè)setTimeout的回調(diào),此時(shí)會(huì)輸出上一步得到的5,然后a被賦值為4。之所以是大約2s是因?yàn)镴avascript定時(shí)器并不精確
添加回答
舉報(bào)