首先建議題主看一篇關於JavaScript文章JavaScript Event Loop運作機制詳解
這篇文章詳細闡述了JavaScript事件輪詢的原理
下面來說說題主的問題:
1、主執行緒會先執行,當執行到test()的時候兩個setTimeout會同時被放進任務佇列,然後執行alert(0),所以先輸出0,此時a的值是19,因為setTimeout還沒執行,a沒有其他賦值機會;
2、主執行緒執行完畢然後輪詢任務佇列執行定時任務,由於第一個setTimeout時間較第二個短,因此首先執行第一個setTimeout的回調,此時約1s後alert(a)會輸出上一步的19,然後a被賦值為5;
3、接著便執行第二個setTimeout,因為兩個setTimeout同時被放進隊列裡面,所以這裡大約會在2s後執行第二個setTimeout的回調,此時會輸出上一步得到的5,然後a被賦值為4。大約2s是因為Javascript定時器並不精確
自己的debug 了解機制會更透徹
第一個定時器執行完 全域的a就已經變成5了test函數中a的變化:1-19-5-最後一次alert(a)-4
首先建議題主看一篇關於JavaScript文章
JavaScript Event Loop運作機制詳解
這篇文章詳細闡述了JavaScript事件輪詢的原理
下面來說說題主的問題:
1、主執行緒會先執行,當執行到test()的時候兩個setTimeout會同時被放進任務佇列,然後執行alert(0),所以先輸出0,此時a的值是19,因為setTimeout還沒執行,a沒有其他賦值機會;
2、主執行緒執行完畢然後輪詢任務佇列執行定時任務,由於第一個setTimeout時間較第二個短,因此首先執行第一個setTimeout的回調,此時約1s後alert(a)會輸出上一步的19,然後a被賦值為5;
3、接著便執行第二個setTimeout,因為兩個setTimeout同時被放進隊列裡面,所以這裡大約會在2s後執行第二個setTimeout的回調,此時會輸出上一步得到的5,然後a被賦值為4。大約2s是因為Javascript定時器並不精確
自己的debug 了解機制會更透徹
第一個定時器執行完 全域的a就已經變成5了
test函數中a的變化:1-19-5-最後一次alert(a)-4