async脚本下载完立即执行、顺序不确定;defer脚本在dom解析完成且domcontentloaded前按书写顺序执行;同步脚本阻塞解析,应避免。

script 标签的 async 和 defer 属性到底谁先执行?
结论很直接:async 脚本不保证执行顺序,defer 严格按 DOM 中出现顺序执行,且都在 DOM 解析完成后、DOMContentLoaded 之前运行。
关键区别不在“谁快”,而在“调度时机”和“依赖关系”:
-
async:下载与 HTML 解析并行,一旦下载完成立即暂停解析、同步执行——所以多个async脚本谁先下完谁先跑,顺序不可控 -
defer:下载并行,但执行被推迟到 HTML 解析完成之后,所有defer脚本按文档顺序排队执行,不阻塞解析也不打乱顺序 - 没加任何属性的
script(即同步脚本):遇到就暂停解析、下载+执行,完全阻塞后续 HTML 处理
常见错误是以为 async = “更快的 defer”,其实它更适合无依赖的独立逻辑(如统计埋点),而 defer 才是替代同步脚本、保持执行顺序的安全选择。
DOMContentLoaded 触发前,哪些脚本一定已执行?
DOMContentLoaded 事件触发时,以下脚本一定已完成执行:
- 所有内联脚本(
<script>...</script>)——只要它们在
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











