JavaScript 的 defer 与 async
2016-09-24 20:28
183 查看
当解析器遇到 script 标签时,文档的解析将停止,并立即下载并执行脚本,脚本执行完毕后将继续解析文档。但是我们可以将脚本标记为 defer,这样就不会停止文档解析,等到文档解析完成才执行脚本,也可以将脚本标记为 async,以便由其他线程对脚本进行解析和执行。
如果脚本是模块化的,不依赖于任何脚本,那么则使用 async。
defer 不应该在内联脚本上使用。从 Gecko 1.9.2 开始,内联脚本的 defer 会被忽略,但是在 Gecko 1.9.1 中,如果定义了 defer 属性,即使内联脚本也会被延迟执行。
defer 的脚本是按照声明顺序执行的。而 async 的脚本不同,只要脚本下载完成,将会立即执行,未必会按照声明顺序执行。
IE9 及以下版本的浏览器,defer 的脚本也未必会按照声明顺序执行。
如果同时使用 defer 和 async,则会默认使用 async,忽略 defer。
三者之间的区别?
script
当解析器遇到 script 标签时,文档的解析将停止,并立即下载并执行脚本,脚本执行完毕后将继续解析文档。defer script
当解析器遇到 script 标签时,文档的解析不会停止,其他线程将下载脚本,待到文档解析完成,脚本才会执行。async script
当解析器遇到 script 标签时,文档的解析不会停止,其他线程将下载脚本,脚本下载完成后开始执行脚本,脚本执行的过程中文档将停止解析,直到脚本执行完毕。什么情况下使用 defer 和 async?
如果脚本不依赖于任何脚本,并不被任何脚本依赖,那么则使用 defer。如果脚本是模块化的,不依赖于任何脚本,那么则使用 async。
需要注意的地方
async 对于内联脚本没有作用。defer 不应该在内联脚本上使用。从 Gecko 1.9.2 开始,内联脚本的 defer 会被忽略,但是在 Gecko 1.9.1 中,如果定义了 defer 属性,即使内联脚本也会被延迟执行。
defer 的脚本是按照声明顺序执行的。而 async 的脚本不同,只要脚本下载完成,将会立即执行,未必会按照声明顺序执行。
IE9 及以下版本的浏览器,defer 的脚本也未必会按照声明顺序执行。
如果同时使用 defer 和 async,则会默认使用 async,忽略 defer。
参考链接
https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/script相关文章推荐
- javascript高级程序设计里,介绍了有关defer和async的区别
- JavaScript标签<script>中的defer和async
- 使用async 和 defer 属性异步加载执行JavaScript
- JavaScript——defer和async
- 【javascript基础】 JavaScript defer和async区别
- javascript中defer和async
- 浅谈JavaScript异步加载的三种方式——async和defer、动态创建script
- javascript标签位置以及defer、async属性的区别
- JavaScript 的 defer 与 async
- 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
- javascript的defer和async的区别。
- 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
- javascript延迟加载及异步(defer和async)
- javascript中的defer和async学习+javascript执行顺序
- javascript中的defer属性和async属性
- 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性
- 关于Javascript中defer和async的区别总结
- 引用JavaScript文件时的两个属性defer和async
- JavaScript无阻塞加载和defer、async详解