問題:setTimeout的延遲事件,是從什么時候開始算起的?
答:
首先你要明白Javascript是單線程,單線程就意味着所有任務需要排隊。然后會將所有任務分成兩類:同步任務和異步任務!同步任務:在主線程上執行的任務,只有前一個任務執行完成,才會執行后一個!異步任務:不進入主線程、而進入“任務隊列”的任務,當主線程上的任務執行完,主線程才會去執行“任務隊列”。
對於setTimeout(fn,200),
當程序執行到setTimeout(fn,200)
這一行時,時間就開始計算,當到200ms時,fn
會被放進“任務隊列”,而“任務隊列”必須要等到主線程已有的代碼執行完才會執行fn,所以
fn
實際執行時並不一定是在200ms后,可能是在更久的時間后(取決於主線程上的同步代碼的執行時間以及它在“任務隊列”的位置)。