JS script脚本中async和defer区别详解


Posted in Javascript onJune 24, 2020

一 引言

代码如下

<script src="https://www.google.com/recaptcha/api.js" async defer></script>

可以看到在script标签中,存在async与defer两个属性,首先这两个属性并共存,说直白点,你一个都不加,或者加两个属性其一,脚本加载规则都会不同,这点我在之前确实没仔细了解过,导致我在实际开发中遇到了这样一个问题:

我在同一个页面需要引用2个script脚本,大致如下:

<script src="https://www.google.com/recaptcha/api.js"></script>
<script src="demo.js"></script>

注意,两个script脚本都没有添加async与defer属性,demo.js中包含了谷歌人机验证的初始化程序,正常来说一定得先加载必要的资源,这样我的验证码才能初始化成功,这就像使用jQuery得先引用jQuery.js是一个道理。

但事实上,因为外网的问题,api.js引用虽然在前面,但下载并不稳定,有时候会出现下载反而比demo.js更晚的情况,这就导致demo.js中的初始化报错,怎么办呢?这就得async与defer出场了,我们先来了解它们的区别。

二 属性async、defer与不加的区别

1 不加属性

引用script脚本,最常见的就是直接引用,不加其它属性,这种情况浏览器会立即下载并执行指定的脚本,一气呵成,脚本不执行完毕,后面的DOM加载全部给我候着,如下图:

JS script脚本中async和defer区别详解

2 属性async

了解ajax的同学对于async这个词一定不陌生,它表示异步,如果script脚本添加了此属性,浏览器会异步下载后立刻同步执行脚本。

说通俗点,脚本下载是异步行为,下载过程中并不影响DOM加载,但一旦脚本下载完毕就会立刻同步执行脚本,此时DOM加载还是得给我等着。如下图:

JS script脚本中async和defer区别详解

3 属性defer

与async一样属于异步下载脚本,但不同的地方是,脚本下载完成后并不会立刻执行,而是等到DOM解析完成才会执行脚本,相比async的粗暴,defer明显更加实用。加载顺序如下图:

JS script脚本中async和defer区别详解

现在我们知道了脚本属性async、defer以及不加的区别,回到文章开始的问题,我希望api.js一定在demo.js之前加载完成,不管需要等多久,所以我们可以这样修改:

<script src="https://www.google.com/recaptcha/api.js" async></script>
<script src="demo.js" defer></script>

那么到这里本文正式结束。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js压缩利器
Feb 20 Javascript
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
js操作ajax返回的json的注意问题!
Feb 23 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
extjs 04_grid 单击事件新发现
Nov 27 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
Dec 12 Javascript
客户端js性能优化小技巧整理
Nov 05 Javascript
jQuery对Select的操作大集合(收藏)
Dec 28 Javascript
BootStrap的JS插件之轮播效果案例详解
May 16 Javascript
原生JS取代一些JQuery方法的简单实现
Sep 20 Javascript
VUE2实现事件驱动弹窗示例
Oct 21 Javascript
vue2.0 实现页面导航提示引导的方法
Mar 13 Javascript
javascript实现前端分页效果
Jun 24 #Javascript
JS实现多选框的操作
Jun 24 #Javascript
微信小程序实现发微博功能的示例代码
Jun 24 #Javascript
JavaScript实现答题评分功能页面
Jun 24 #Javascript
JS实现电脑虚拟键盘打字测试
Jun 24 #Javascript
JS实现简单打字测试
Jun 24 #Javascript
微信小程序实现多选框功能的实例代码
Jun 24 #Javascript
You might like
小偷PHP+Html+缓存
2006/11/25 PHP
PHP 高级课程笔记 面向对象
2009/06/21 PHP
PHPThumb图片处理实例
2014/05/03 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
JavaScript Event学习第三章 早期的事件处理程序
2010/02/07 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
2013/06/27 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
现如今最流行的JavaScript代码规范
2014/03/08 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
Python extract及contains方法代码实例
2020/09/11 Python
python+opencv实现车道线检测
2021/02/19 Python
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
Java的接口和C++的虚类的相同和不同处
2014/03/27 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
师说教学反思
2014/02/07 职场文书
犯错检讨书
2014/02/21 职场文书
公司募捐倡议书
2014/05/14 职场文书
高考励志标语
2014/06/05 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
三八妇女节慰问信
2015/02/14 职场文书
全陪导游词开场白
2015/05/29 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
python实现网络五子棋
2021/04/11 Python
MySQL分区路径子分区再分区
2022/04/13 MySQL