首頁 > web前端 > js教程 > 了解非同步和延遲

了解非同步和延遲

王林
發布: 2024-08-09 01:58:42
原創
822 人瀏覽過

Understanding async and defer

這是流行的前端面試問題之一。它測試受訪者對 HTML、JS 和效能的了解。

這是前端面試問題系列的第 1 個問題。如果您希望提高準備程度或保持最新狀態,請考慮註冊 FrontendCamp。


script 標籤用於將 JavaScript 新增至 HTML 頁面。它可以是內聯腳本或外部腳本。

<body>
  <!-- Some code before it -->

  <script>
    console.log("This is an inline script.");
  </script>

  <script src="https://example.com/external-script.js" />

  <!-- Some code after it -->
</body>
登入後複製

在解析 HTML 時,如果瀏覽器遇到 script 標籤,它將停止 HTML 解析並開始執行 JS 腳本。如果它是內聯的,它將立即開始執行,但如果它是外部腳本,它將下載然後執行。

在此期間,當JS腳本正在下載並執行時,HTML解析被阻塞。只有瀏覽器執行完 JS 腳本後才能恢復。

你看出這裡出了什麼問題嗎?這將為最終用戶帶來效能問題。如果我們有很多腳本或某個腳本需要很長時間來執行,使用者將很長時間看不到頁面的內容。

為了解決這個問題,我們有兩個屬性:async 和 defer。

非同步

如果存在 async 屬性,則腳本將在解析 HTML 的同時並行下載,並在可用時立即執行。

如果多個腳本使用 async 屬性,執行順序可能與它們在 HTML 中出現的順序不同。最先可用的腳本將首先執行。

<body>
  <!-- Some code before it -->

  <script async src="https://example.com/external-script.js" />

  <!-- Some code after it -->
</body>
登入後複製

延遲

如果存在 defer 屬性,腳本將與 HTML 解析並行下載(就像非同步一樣),但在 HTML 解析完成後、觸發 DOMContentLoaded 之前執行。

如果多個腳本使用 defer 屬性,執行順序將保持不變,與 async 不同。

<body>
  <!-- Some code before it -->

  <script defer src="https://example.com/external-script.js" />

  <!-- Some code after it -->
</body>
登入後複製

概括

  1. 非同步和延遲下載腳本都不會阻止 HTML 解析。
  2. 非同步腳本將在可用時立即執行。它可能會阻止 HTML 解析。
  3. defer 腳本只會在 HTML 解析完成後、觸發 DOMContentLoaded 之前執行。
  4. 如果執行順序無關緊要且腳本不修改 DOM,請使用非同步。
  5. 如果執行順序很重要或腳本修改了 DOM,請使用 defer。
  6. 另請注意,這些屬性不適用於內嵌腳本,即沒有 src 屬性的腳本。
  7. 如果同時新增了 async 和 defer,則 async 優先。

資源

MDN:腳本元素
前端營地

以上是了解非同步和延遲的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板