JavaScript 中 script 代碼塊的執行:宏任務與微任務
關于 JavaScript 中 <script> 代碼塊的執行機制及其與宏任務(macrotask)的關系,存在一些常見的誤解。本文將澄清這些誤解,并詳細解釋其執行順序。</script>
<script> 代碼塊是同步執行,而非宏任務</script>
<script> 代碼塊并非宏任務。<a style="color:#f60; text-decoration:underline;" title= "瀏覽器"href="https://www.php.cn/zt/16180.html" target="_blank">瀏覽器在解析 HTML 時遇到 <script> 標簽,會立即暫停 HTML 解析,并同步執行其中的 JavaScript 代碼。 這與宏任務(例如 setTimeout、setInterval)的異步執行機制截然不同。宏任務會在當前執行棧清空后,由事件循環機制安排執行。</script>
讓我們來看一個例子:
console.log('script1'); promise.resolve().then(() => console.log('promise1')); console.log('script2');
一些人可能會誤以為 <script> 代碼塊是宏任務,預期輸出順序為:</script>
立即學習“Java免費學習筆記(深入)”;
script1 promise1 script2
然而,實際輸出順序是:
script1 script2 promise1
這是因為 <script> 代碼塊同步執行,console.log(‘script1’) 和 console.log(‘script2’) 會在 Promise.resolve().then() 之前完成。then() 方法中的回調函數屬于微任務(microtask),會在當前執行棧清空后,但在下一個宏任務之前執行。</script>
<script> 代碼塊的執行流程</script>
瀏覽器解析 HTML 時,遇到 <script> 標簽,會立即執行以下步驟:</script>
- 暫停 HTML 解析: 瀏覽器暫停 HTML 解析過程。
- JavaScript 引擎執行: JavaScript 引擎接管控制權,同步執行 <script> 代碼塊中的 JavaScript 代碼。</script>
- 恢復 HTML 解析: JavaScript 代碼執行完畢后,瀏覽器恢復 HTML 解析過程。
這種同步執行機制與異步的宏任務形成對比。宏任務需要排隊等待事件循環機制安排執行時間。
因此,理解 <script> 代碼塊的同步執行機制對于正確理解 JavaScript 代碼的執行順序至關重要。 它不是宏任務,而是直接由 JavaScript 引擎同步執行的代碼塊。</script>