JavaScript中defer和async的区别

defer是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。浏览器渲染页面,读取到包含defer属性的外部<script>标签时不会停止DOM渲染,而是异步下载,加载完整个页面再运行js。有多个defer的标签时,会按照顺序下载执行。

async浏览器立即异步下载文件,不同于defer得是,下载完成会立即执行,此时会阻塞dom渲染,所以async的script最好不要操作dom。因为是下载完立即执行,不能保证多个加载时的先后顺序。

 

三种加载方式。

 

1.正常模式

 

<script src="script.js"></script>

没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

 

2.async模式

<script async src="script.js"></script>

有 async,script.js会被异步加载,即加载和渲染后续文档元素的过程将和 script.js 的加载并行进行(异步)。当 script.js加载完整立即执行script.js。执行script.js时,html解析暂停。
从加载完成立即执行来看,async模式 执行顺序与写的顺序无关,不保证执行顺序。

 

3.defer 模式

<script defer src="index.js"></script> 

有 defer,script.js会被异步加载,即加载和渲染后续文档元素的过程将和 script.js 的加载并行进行(异步)。这一点与async模式一致。
不同的是当 script.js加载完成并不会立即执行,而是在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成。因此它会按照写的顺序执行。

 

如图所示

 

 

posted @ 2020-07-14 17:42  瑞瑞大人  阅读(650)  评论(0编辑  收藏  举报