defer
和async
都是用于控制 HTML 中<script>
标签加载和执行 JavaScript 的属性,它们的作用有所不同:
defer:
- 当浏览器遇到带有
defer
属性的<script>
标签时,它会继续解析 HTML 页面,同时并行下载 defer 脚本。- 但是,脚本的执行会被推迟到页面解析完毕(
DOMContentLoaded
事件触发之前),即使脚本在下载过程中已经准备就绪。- 多个 defer 脚本按照它们在文档中出现的顺序依次执行。
async:
- 当浏览器遇到带有
async
属性的<script>
标签时,它会继续解析 HTML 页面,同时异步下载 async 脚本。- 下载完成后,立即执行脚本,不会阻塞 HTML 解析过程。
- 多个 async 脚本的执行顺序不确定,取决于它们的下载完成顺序。
主要区别在于脚本执行的时机和页面解析的关系:
就三个关键点【下载的时机】【执行的时机】【执行的顺序】