改變你對事件循環錯誤的認知!
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
瀏覽器的進程模型何為進程?
何為線程?
瀏覽器有哪些進程和線程?瀏覽器是一個多進程多線程的應用程序 瀏覽器右上角三個點那里的 每打開一個標簽頁就會開啟一個渲染線程,嘗試多打開一個標簽頁,任務管理器會多一個線程。
渲染主線程是如何工作的?渲染主線程是瀏覽器中最繁忙的的線程,需要它處理的任務包括但不限于:
為何只能有一個渲染主線程?比如正在執行一個js函數去修改頁面,定時器的任務也到達了時間,那么應該執行哪個?同時執行的話,修改了同一個地方如何選擇。 一個渲染進程只能有一個渲染主進程,使用消息隊列來調度任務
若干解釋何為異步?代碼執行過程中,會遇到一些無法立即執行的任務,比如:
面試題:如何理解 JS 的異步?Js 是一門單線程的語言,這是因為它運行在瀏覽器的渲染主線程中,而渲染主線程只有一個。 js 為何會阻礙渲染?渲染主線程只有一個,js 的執行與渲染都在主線程中,兩者無法同時執行。react 的fiber 就是為了解決此問題 任務有優先級嗎?任務沒有優先級,消息隊列有優先級,消息隊列會有多種,隨著瀏覽器的復雜度急劇提升,W3C 將不再使用宏隊列的說法 根據 W3C 的最新解釋:
在目前 chrome 的實現中,至少包含了下面隊列, 微隊列 > 交互隊列 > 延時隊列
幾道題加深理解setTimeout(()=>{ console.log(1) // 交給計時線程,等待添加到延時隊列 },0) console.log(2) // 執行完后執行延時隊列中的任務 結果:輸入 2,1 function delay(duration){ var start = Date.now(); while (Date.now() - start < duration){} } setTimeout(()=>{ console.log(1) // 交給計時線程,等待添加到延時隊列 },0) delay(1000) // 阻塞主線程一秒
console.log(2) // 輸出 2,由于阻塞一秒后,計時線程已經把任務計時完成加到延時隊列了,所以輸出 2 后立即輸出 1 結果:等待一秒后,同時輸出 2,1 setTimeout(()=>{ console.log(1) // 交給計時線程,等待添加到延時隊列 },0) Promise.resolve().then(()=>{ console.log(2) // 立即添加到微隊列,微隊列優先級高于延時隊列 }) console.log(3) // 全局任務 結果:輸出 3,2,1 // 只是定義,還未執行哈 function a(){ console.log(1) Promise.resolve().then(()=>{ console.log(2) }) } setTimeout(()=>{ console.log(3) Promise.resolve().then(a) },0) Promise.resolve().then(()=>{ console.log(4) // 立即添加到微隊列,微隊列優先級高于延時隊列 }) console.log(5) // 全局 結果:5,4,3,1,2 總結什么是事件循環?
JS 中的計時器能做到精確計時嗎?不行,因為
結語:單線程是異步產生的原因,事件循環是異步的實現方式 該文章在 2023/8/28 9:28:08 編輯過 |
關鍵字查詢
相關文章
正在查詢... |