文章目錄
前言
闡述 JS 的事件循環
JS 中的計時器能做到精確計時嗎?為什么?
如何理解 JS 的異步?
前言
本文章介紹三道圍繞 JavaScript 的精選面試題
闡述 JS 的事件循環
????????事件循環?叫做消息循環,是瀏覽器渲染主線程的?作?式。 在 Chrome 的源碼中,它開啟?個不會結束的 for 循環,每次循環從消息 隊列中取出第?個任務執?,?其他線程只需要在合適的時候將任務加?到 隊列末尾即可。 過去把消息隊列簡單分為宏隊列和微隊列,這種說法?前已?法滿?復雜的 瀏覽器環境,取?代之的是?種更加靈活多變的處理?式。 根據 W3C 官?的解釋,每個任務有不同的類型,同類型的任務必須在同? 個隊列,不同的任務可以屬于不同的隊列。不同任務隊列有不同的優先級, 在?次事件循環中,由瀏覽器??決定取哪?個隊列的任務。但瀏覽器必須 有?個微隊列,微隊列的任務?定具有最?的優先級,必須優先調度執?。
JS 中的計時器能做到精確計時嗎?為什么?
不?,因為:
計算機硬件沒有原?鐘,?法做到精確計時
操作系統的計時函數本身就有少量偏差,由于 JS 的計時器最終調?的 是操作系統的函數,也就攜帶了這些偏差
按照 W3C 的標準,瀏覽器實現計時器時,如果嵌套層級超過 5 層, 則會帶有 4 毫秒的最少時間,這樣在計時時間少于 4 毫秒時?帶來 了偏差
受事件循環的影響,計時器的回調函數只能在主線程空閑時運?,因此 ?帶來了偏差
如何理解 JS 的異步?
????????JS是??單線程的語?,這是因為它運?在瀏覽器的渲染主線程中,?渲染 主線程只有?個。
??????? ?渲染主線程承擔著諸多的?作,渲染??、執? JS 都在其中運?。 如果使?同步的?式,就極有可能導致主線程產?阻塞,從?導致消息隊列 中的很多其他任務?法得到執?。這樣一來,???會導致繁忙的主線程? ?的消耗時間,另???導致???法及時更新,給?戶造成卡死現象。
??????? 所以瀏覽器采?異步的?式來避免。具體做法是當某些任務發?時,?如計 時器、?絡、事件監聽,主線程將任務交給其他線程去處理,?身?即結束 任務的執?,轉?執?后續代碼。當其他線程完成時,將事先傳遞的回調函 數包裝成任務,加?到消息隊列的末尾排隊,等待主線程調度執?。 在這種異步模式下,瀏覽器永不阻塞,從?最?限度的保證了單線程的流暢運?。