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 相关文章推荐
picChange 图片切换特效的函数代码
May 06 Javascript
JavaScript中的排序算法代码
Feb 22 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
Jan 03 Javascript
js如何实现设计模式中的模板方法
Jul 23 Javascript
使用jQuery插件创建常规模态窗口登陆效果
Aug 23 Javascript
js动态添加onclick事件可传参数与不传参数
Jul 29 Javascript
jquery用offset()方法获得元素的xy坐标
Sep 06 Javascript
JavaScript获得url查询参数的方法
Jul 02 Javascript
js获取新浪天气接口的实现代码
Jun 06 Javascript
jQuery中Nicescroll滚动条插件的用法
Nov 10 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 jQuery
vuex + keep-alive实现tab标签页面缓存功能
Oct 17 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新手谈谈我的学习心得
2007/02/25 PHP
mysql时区问题
2008/03/26 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
PHP实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
JavaScript 学习笔记(十六) js事件
2010/02/01 Javascript
JavaScript 语言的递归编程
2010/05/18 Javascript
js getBoundingClientRect() 来获取页面元素的位置
2010/11/25 Javascript
jQuery Ajax提交表单查询获得数据实例代码
2012/09/19 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
bootstrap3使用bootstrap datetimepicker日期插件
2017/05/24 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
js实现拖拽与碰撞检测
2020/09/18 Javascript
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
python使用chardet判断字符串编码的方法
2015/03/13 Python
Python 出现错误TypeError: ‘NoneType’ object is not iterable解决办法
2017/01/12 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
使用tensorflow根据输入更改tensor shape
2020/06/23 Python
详解Python中Pyyaml模块的使用
2020/10/08 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
苹果音乐订阅:Apple Music
2018/08/02 全球购物
最新奶茶店创业计划书范文
2014/02/08 职场文书
机械制造毕业生求职信
2014/03/03 职场文书
导师评语大全
2014/04/26 职场文书
大学军训通讯稿
2015/07/18 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
工作感想范文
2015/08/07 职场文书
学会感恩主题班会
2015/08/12 职场文书