defer
defer所谓的推迟,并不是推迟JS文件的下载,而是将其执行时机推出到HTML文档解析完成之后,DOMContentLoaded之前。
- 不阻塞浏览器解析HTML,等解析完HTML之后,才会执行script
- 会在脚本下载并执行完之后,才会触发
DOMContentLoaded
事件 - 在脚本执行过程总,一定可以获取到HTML中已有的元素
-
async
异步下载,同步执行。
不阻塞浏览器解析 HTML,但是script下载完成后,会立即中断浏览器解析 HTML,并执行此script
- 互相独立,谁先下载完,谁先执行,没有固定的先后顺序,不可控
- 由于没有确定的执行时机,所以在脚本里面可能会获取不到 HTML 中已有的元素
DOMContentLoaded
事件和script脚本无相关性,无法确定他们的先后顺序- 适用于:独立的第三方脚本。
相同点:
- script下载时都不阻塞浏览器解析HTML;
不同点:
- async在下载完成后,立即执行;多个async文件执行没有顺序;
- defer是在HTML解析完成后执行,多个defer按顺序执行;