script标签中的defer与async

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: script标签中的defer与async

两者都是用来异步加载js文件,提高网页性能。

1. async

1.2 使用场景

主要是不涉及操作DOM的事件,比如使用百度分析的脚本

1.1 与html解析、DOMContentLoaded的关系

情况1:HTML 还没有被解析完的时候,async脚本已经加载完了,那么 HTML

停止解析,去执行脚本,脚本执行完毕后触发DOMContentLoaded事件。

image.png

情况2: HTML 解析完了之后,async脚本才加载完,然后再执行脚本,那么在HTML解析完毕、async脚本还没加载完的时候就触发DOMContentLoaded事件。

image.png

1.3 综述
  1. 无论html是否解析完成,立即执行脚本;
  2. 无论有使用多少个async加载脚本,只要脚本下载完成,立即执行脚本。与<script>标签的顺序无关。

2. defer

2.1 使用场景

操作DOM的脚本,为防止元素尚未加载完成,脚本找不到元素报错。

2.2 html解析、DOMContentLoaded的关系

情况1:HTML还没解析完成时,defer脚本已经加载完毕,那么defer脚本将等待HTML解析完成后再执行。defer脚本执行完毕后触发DOMContentLoaded事件。

image.png

情况2: HTML解析完成时,defer脚本还没加载完毕,那么defer脚本继续加载,加载完成后直接执行,执行完毕后触发DOMContentLoaded事件。

image.png

2.3 综述
  1. 无论js文件是否下载完成,只有html解析完毕,才可以执行脚本;
  2. 脚本执行的顺序与下载的完成时间无关,按照<script>脚本的位置,顺序执行。

注: 图片来源网络。

相关文章
|
5月前
|
JavaScript 前端开发
一个js里可以有多少个async function,如何用最少的async function实现多个异步操作
在 JavaScript 中,可以通过多种方法实现多个异步操作并减少 `async` 函数的数量。
|
7月前
|
前端开发 JavaScript
js【详解】async await
js【详解】async await
47 0
|
9月前
|
JavaScript 前端开发 Go
理解 <script> 标签的 defer 和 async 属性
理解 <script> 标签的 defer 和 async 属性
192 3
|
JavaScript 前端开发 Go
async vs defer 的区别
async vs defer 的区别
84 0
|
前端开发 JavaScript
js - ASYNC/AWAIT
`async/await` 是一个 es7 的语法
|
移动开发 Go UED
<script> 标签上的 defer 和 async 属性是什么?
它会执行以下步骤 1.暂停 HTML 文档解析器 2.创建新请求以下载脚本 3.在脚本完全下载后立即执行脚本 4.执行结束后,继续解析 HTML 文档
|
Go API
script标签中defer和async有什么不同?
script标签中defer和async有什么不同?
122 0
script标签中defer和async有什么不同?
|
前端开发 JavaScript
了解js中async-await
了解async异步函数如何使用并且使用中的注意点
194 0
了解js中async-await
|
前端开发 JavaScript
JS循环中使用async、await的正确姿势
使用filter过滤item为vue或者react的选项
307 0
JS循环中使用async、await的正确姿势