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 节点遍历函数
Mar 28 Javascript
理解Javascript_11_constructor实现原理
Oct 18 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
Sep 22 Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 Javascript
iframe中子父类窗口调用JS的方法及注意事项
Aug 25 Javascript
总结JavaScript中布尔操作符||与&amp;&amp;的使用技巧
Nov 17 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
Sep 03 Javascript
JS操作xml对象转换为Json对象示例
Mar 25 Javascript
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
Feb 28 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 Javascript
彻底搞懂并解决vue-cli4中图片显示的问题实现
Aug 31 Javascript
uniapp微信小程序:key失效的解决方法
Jan 20 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图片处理函数获取类型及扩展名实例
2014/11/19 PHP
php利用scws实现mysql全文搜索功能的方法
2014/12/25 PHP
PHP如何实现订单的延时处理详解
2017/12/30 PHP
PHP使用ActiveMQ实例
2018/02/05 PHP
阿里云的WindowsServer2016上部署php+apache
2018/07/17 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
JavaScript常用函数工具集:lao-utils
2016/03/01 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
jquery拖动改变div大小
2017/07/04 jQuery
微信小程序“摇一摇”的实例代码
2017/07/20 Javascript
webpack3之loader全解析
2017/10/26 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
layui的select联动实现代码
2019/09/28 Javascript
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
python with语句的原理与用法详解
2020/03/30 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
家长对孩子评语
2014/01/30 职场文书
行政助理的岗位职责
2014/02/18 职场文书
2014年局领导班子自身建设情况汇报
2014/11/21 职场文书
2015年环卫工作总结
2015/04/28 职场文书
第二次离婚起诉书
2015/05/18 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
2015年高校保卫处工作总结
2015/07/23 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
担保书格式范文
2015/09/22 职场文书
学校标语口号大全
2015/12/26 职场文书
党员廉政准则心得体会
2016/01/20 职场文书
2016年万圣节活动个人总结
2016/04/05 职场文书
Pandas自定义选项option设置
2021/07/25 Python
MySQL分区表实现按月份归类
2021/11/01 MySQL
如何Python使用re模块实现okenizer
2022/04/30 Python