javascript - setTimeout的延遲時間,是從什么時間段開始算起的?
問題描述
setTimeout(fn,200),這里指定的時間,是指程序一開始運(yùn)行就計算了嗎?還是說等到執(zhí)行完主線程的任務(wù)后,回調(diào)異步任務(wù)列表的時候才開始計算?
問題解答
回答1:這個解釋起來有點(diǎn)復(fù)雜首先你要明白Javascript是單線程,單線程就意味著所有任務(wù)需要排隊。然后會將所有任務(wù)分成兩類:同步任務(wù)和異步任務(wù)!同步任務(wù):在主線程上執(zhí)行的任務(wù),只有前一個任務(wù)執(zhí)行完成,才會執(zhí)行后一個!異步任務(wù):不進(jìn)入主線程、而進(jìn)入“任務(wù)隊列”的任務(wù),當(dāng)主線程上的任務(wù)執(zhí)行完,主線程才會去執(zhí)行“任務(wù)隊列”。
對于setTimeout(fn,200),當(dāng)?shù)?00ms時,fn會被放進(jìn)“任務(wù)隊列”,而“任務(wù)隊列”必須要等到主線程已有的代碼執(zhí)行完才會執(zhí)行fn,所以當(dāng)程序執(zhí)行到setTimeout(fn,200)這一行時,時間就開始計算,但是fn實際執(zhí)行時并不一定是在200ms后,可能是在更久的時間后(取決于主線程上的同步代碼的執(zhí)行時間)。
回答2:簡單的講setTimeout(fn,200)需要等到當(dāng)前函數(shù)調(diào)用棧(主進(jìn)程上的同步任務(wù))清空之后才開始執(zhí)行,會在下一輪事件循環(huán)(主線程從'任務(wù)隊列'中讀取事件)開始時執(zhí)行,setTimeout只上將事件插入了'任務(wù)隊列',這里設(shè)置的時間是相對于在下一輪事件循環(huán)開始時的時間的間隔。
回答3:從 setTimeout(fn,200) 調(diào)用時開始計時。
