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 相关文章推荐
基于jquery的修改当前TAB显示标题的代码
Dec 11 Javascript
ajax更新数据后,jquery、jq失效问题
Mar 16 Javascript
js拖拽一些常见的思路方法整理
Mar 19 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
May 06 Javascript
js 声明数组和向数组中添加对象变量的简单实例
Jul 28 Javascript
jQuery实现简单的网页换肤效果示例
Sep 18 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
Sep 21 Javascript
AngularJs导出数据到Excel的示例代码
Aug 11 Javascript
vue页面离开后执行函数的实例
Mar 13 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
vue 解决IOS10低版本白屏的问题
Nov 17 Javascript
jQuery实现穿梭框效果
Jan 19 jQuery
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导出excel格式数据问题
2014/03/11 PHP
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
js时间戳格式化成日期格式的多种方法
2013/11/11 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
js中跨域方法原理详解
2015/07/19 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
vue中Axios的封装与API接口的管理详解
2018/08/09 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
[45:25]完美世界DOTA2联赛循环赛 PXG vs IO 第一场 11.06
2020/11/09 DOTA
mac系统安装Python3初体验
2018/01/02 Python
python机器学习理论与实战(一)K近邻法
2021/01/28 Python
Python抽象和自定义类定义与用法示例
2018/08/23 Python
python UDP(udp)协议发送和接收的实例
2019/07/22 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
Python如何实现定时器功能
2020/05/28 Python
使用jupyter notebook运行python和R的步骤
2020/08/13 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
AmazeUI 按钮交互的实现示例
2020/08/24 HTML / CSS
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
阿迪达斯意大利在线商店:adidas意大利
2016/09/19 全球购物
Joe Fresh官网:加拿大时尚品牌和零售连锁店
2016/11/30 全球购物
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
医学生实习自我鉴定
2013/09/27 职场文书
毕业生找工作求职信
2014/08/05 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
广告公司文案策划岗位职责
2015/04/14 职场文书