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应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
javascript调试说明
Jun 07 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
Feb 11 Javascript
jQuery中ajax和post处理json的不同示例对比
Nov 02 Javascript
JS实现网页标题随机显示名人名言的方法
Nov 03 Javascript
js实现上下左右弹框划出效果
Mar 08 Javascript
jQuery:unbind方法的使用详解
Aug 14 jQuery
node使用Mongoose类库实现简单的增删改查
Nov 08 Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 Javascript
在项目vue中使用echarts的操作步骤
Sep 07 Javascript
JavaScript中条件语句的优化技巧总结
Dec 04 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP错误处理函数
2016/04/03 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Aliyun Linux 编译安装 php7.3 tengine2.3.2 mysql8.0 redis5的过程详解
2020/10/20 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
JavaScript字符串String和Array操作的有趣方法
2012/12/18 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
JavaScript实现计算多边形质心的方法示例
2018/01/31 Javascript
Vue.js 2.0和Cordova开发webApp环境搭建方法
2018/02/26 Javascript
js实现各浏览器全屏代码实例
2018/07/03 Javascript
微信小程序实现卡片左右滑动效果的示例代码
2019/05/01 Javascript
弱类型语言javascript中 a,b 的运算实例小结
2019/08/07 Javascript
js实现随机抽奖
2020/03/19 Javascript
Python抓取电影天堂电影信息的代码
2016/04/07 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Python实现在某个数组中查找一个值的算法示例
2018/06/27 Python
Python hashlib模块加密过程解析
2019/11/05 Python
如何在Windows中安装多个python解释器
2020/06/16 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
房产委托公证书
2014/04/08 职场文书
春季防火方案
2014/05/10 职场文书
小学校园广播稿(3篇)
2014/09/19 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
基于Java的MathML转图片的方法(示例代码)
2021/06/23 Java/Android