首頁  >  問答  >  主體

javascript - setTimeout的延遲時間,是從什麼時間段開始算起的?

setTimeout(fn,200),這裡指定的時間,是指程式一開始運作就計算了嗎?還是說等到執行完主執行緒的任務後,回調非同步任務清單的時候才開始計算?

女神的闺蜜爱上我女神的闺蜜爱上我2663 天前1243

全部回覆(3)我來回復

  • 世界只因有你

    世界只因有你2017-07-05 11:05:30

    這個解釋起來有點複雜
    首先你要明白Javascript是單線程,單線程就意味著所有任務都需要排隊。然後會將所有任務分成兩類:同步任務和非同步任務!同步任務:在主執行緒上執行的任務,只有前一個任務執行完成,才會執行後一個!非同步任務:不進入主執行緒、而進入「任務佇列」的任務,當主執行緒上的任務執行完,主執行緒才會去執行「任務佇列」。

    對於setTimeout(fn,200),當到200ms時,fn會被放進“任務隊列”,而“任務隊列”必須要等到主線程已有的代碼執行完才會執行fn ,所以當程式執行到setTimeout(fn,200)這一行時,時間就開始計算,但是fn實際執行時並不一定是在200ms後,可能是在更久的時間後(取決於主線程上的同步程式碼的執行時間)。

    回覆
    0
  • 欧阳克

    欧阳克2017-07-05 11:05:30

    簡單的講setTimeout(fn,200)需要等到當前函數呼叫堆疊(主進程上的同步任務)清空之後才開始執行,會在下一輪事件循環(主執行緒從"任務佇列"讀取事件)開始時執行,setTimeout只上將事件插入了"任務佇列",這裡設定的時間是相對於在下一輪事件循環開始時的時間的間隔。

    回覆
    0
  • 巴扎黑

    巴扎黑2017-07-05 11:05:30

    setTimeout(fn,200) 呼叫時開始計時。

    回覆
    0
  • 取消回覆