84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
setTimeout(fn,200),這裡指定的時間,是指程式一開始運作就計算了嗎?還是說等到執行完主執行緒的任務後,回調非同步任務清單的時候才開始計算?
setTimeout(fn,200)
這個解釋起來有點複雜首先你要明白Javascript是單線程,單線程就意味著所有任務都需要排隊。然後會將所有任務分成兩類:同步任務和非同步任務!同步任務:在主執行緒上執行的任務,只有前一個任務執行完成,才會執行後一個!非同步任務:不進入主執行緒、而進入「任務佇列」的任務,當主執行緒上的任務執行完,主執行緒才會去執行「任務佇列」。
對於setTimeout(fn,200),當到200ms時,fn會被放進“任務隊列”,而“任務隊列”必須要等到主線程已有的代碼執行完才會執行fn,所以當程式執行到setTimeout(fn,200)這一行時,時間就開始計算,但是fn實際執行時並不一定是在200ms後,可能是在更久的時間後(取決於主線程上的同步程式碼的執行時間)。
fn
簡單的講setTimeout(fn,200)需要等到當前函數呼叫堆疊(主進程上的同步任務)清空之後才開始執行,會在下一輪事件循環(主執行緒從"任務佇列"讀取事件)開始時執行,setTimeout只上將事件插入了"任務佇列",這裡設定的時間是相對於在下一輪事件循環開始時的時間的間隔。
setTimeout
從setTimeout(fn,200)呼叫時開始計時。
這個解釋起來有點複雜
首先你要明白Javascript是單線程,單線程就意味著所有任務都需要排隊。然後會將所有任務分成兩類:同步任務和非同步任務!同步任務:在主執行緒上執行的任務,只有前一個任務執行完成,才會執行後一個!非同步任務:不進入主執行緒、而進入「任務佇列」的任務,當主執行緒上的任務執行完,主執行緒才會去執行「任務佇列」。
對於
setTimeout(fn,200)
,當到200ms時,fn
會被放進“任務隊列”,而“任務隊列”必須要等到主線程已有的代碼執行完才會執行fn
,所以當程式執行到setTimeout(fn,200)
這一行時,時間就開始計算,但是fn
實際執行時並不一定是在200ms後,可能是在更久的時間後(取決於主線程上的同步程式碼的執行時間)。簡單的講
setTimeout(fn,200)
需要等到當前函數呼叫堆疊(主進程上的同步任務)清空之後才開始執行,會在下一輪事件循環(主執行緒從"任務佇列"讀取事件)開始時執行,setTimeout
只上將事件插入了"任務佇列",這裡設定的時間是相對於在下一輪事件循環開始時的時間的間隔。從
setTimeout(fn,200)
呼叫時開始計時。