defer
和 async
是用于在 HTML <script>
标签中控制脚本加载和执行的属性。它们有以下区别:
-
加载顺序:
defer
:脚本将按照 HTML 文档的顺序加载,并在文档解析完毕后执行。多个带有defer
属性的脚本会按照它们在文档中的顺序依次执行。async
:脚本的加载和页面其他内容的加载是异步进行的,不会阻塞HTML文档的解析过程。脚本加载完成后立即执行,不保证多个带有async
属性的脚本的执行顺序。
-
执行时机:
defer
:脚本在文档解析完成后才执行,通常在DOMContentLoaded
事件之前执行。async
:脚本加载完成后会立即执行,不论文档是否已解析完毕。如果脚本加载早于文档解析完毕,它将立即执行;如果文档解析早于脚本加载完成,脚本会在加载完成后立即执行。
-
依赖关系:
defer
:多个带有defer
属性的脚本会按照它们在文档中的顺序依次执行,后面的脚本可以依赖前面的脚本。async
:多个带有async
属性的脚本之间没有依赖关系,它们的加载和执行顺序不确定。
综上所述,如果需要按照特定顺序加载和执行脚本并确保在文档解析完毕后执行,可以使用 defer
属性。而如果脚本之间没有依赖关系,可以并行加载和执行,并且在加载完成后立即执行,则可以使用 async
属性。
script
:会阻碍HTML
解析,只有下载好并执行完脚本才会继续解析HTML
。defer
:浏览器指示脚本在文档被解析后执行,script
被异步加载后并不会立刻执行,而是等待文档被解析完毕后执行。async
:同样是异步加载脚本,区别是脚本加载完毕后立即执行,这导致async
属性下的脚本是乱序的,对于script
有先后依赖关系的情况,并不适用
蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析