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 相关文章推荐
javascript打开新窗口同时关闭旧窗口
Jan 16 Javascript
JavaScript 快捷键设置实现代码
Mar 13 Javascript
JavaScript 代码压缩工具小结
Feb 27 Javascript
JavaScript中的getTime()方法使用详解
Jun 10 Javascript
jquery实现叠层3D文字特效代码分享
Aug 21 Javascript
js实现仿爱微网两级导航菜单效果代码
Aug 31 Javascript
js带前后翻页的图片切换效果代码分享
Sep 08 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
详解Vue.use自定义自己的全局组件
Jun 14 Javascript
利用npm 安装删除模块的方法
May 15 Javascript
Vue 中的受控与非受控组件的实现
Dec 17 Javascript
简单了解JavaScript中常见的反模式
Jun 21 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生成随机密码的三种方法小结
2010/09/04 PHP
PHP获取数组的键与值方法小结
2015/06/13 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
获取HTML DOM节点元素的方法的总结
2009/08/21 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
jquery+css3打造一款ajax分页插件(自写)
2014/06/18 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
JavaScript中用let语句声明作用域的用法讲解
2016/05/20 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
Vue.js每天必学之构造器与生命周期
2016/09/05 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
详解如何在vue项目中使用layui框架及采坑
2019/05/05 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue 解决异步数据更新问题
2019/10/29 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
在Python中使用next()方法操作文件的教程
2015/05/24 Python
vue常用指令代码实例总结
2020/03/16 Python
python绘制趋势图的示例
2020/09/17 Python
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
JSF的标签库有哪些
2012/04/27 面试题
怎样写留学自荐信
2013/11/11 职场文书
自荐书范文范例
2014/02/13 职场文书
护士求职自荐信范文
2014/03/19 职场文书
班子四风对照检查材料思想汇报
2014/09/29 职场文书
论文致谢词范文
2015/05/14 职场文书
建国大业观后感800字
2015/06/01 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
详解Java实践之抽象工厂模式
2021/06/18 Java/Android