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中的bind绑定事件与文本框改变事件的临时解决方法
Aug 13 Javascript
使用jQuery的将桌面应用程序引入浏览器
Nov 19 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
javascript+xml实现简单图片轮换(只支持IE)
Dec 23 Javascript
使用jQuery的attr方法来修改onclick值
Jul 07 Javascript
基于jquery实现日历签到功能
Sep 11 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
jQuery实现的分页功能示例
Jan 22 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
Jul 05 Javascript
vue 页面加载进度条组件实例
Feb 05 Javascript
ios中视频的最后一桢问题解决
May 14 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
May 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
根德YB400的电路分析
2021/03/02 无线电
php实现猴子选大王问题算法实例
2015/04/20 PHP
php获取系统变量方法小结
2015/05/29 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
php7下的filesize函数
2019/09/30 PHP
jquery 图片Silhouette Fadeins渐显效果
2010/02/07 Javascript
javascript工具库代码
2012/03/29 Javascript
javascript实例--教你实现扑克牌洗牌功能
2014/05/15 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
JavaScript中的call方法和apply方法使用对比
2015/08/12 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
浅谈如何实现easyui的datebox格式化
2016/06/12 Javascript
Bootstrap表单控件使用方法详解
2017/01/11 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
JS实现点击链接切换显示隐藏内容的方法
2017/10/19 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
深入理解 JS 垃圾回收
2019/06/03 Javascript
Python中的localtime()方法使用详解
2015/05/22 Python
小小聊天室Python代码实现
2016/08/17 Python
python中使用psutil查看内存占用的情况
2018/06/11 Python
python 将对象设置为可迭代的两种实现方法
2019/01/21 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
canvas绘制图片drawImage使用方法
2020/09/15 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
女子锻炼服装和瑜伽服装:Splits59
2019/03/04 全球购物
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
求职自荐信怎么写
2014/03/06 职场文书
2015年劳动部工作总结
2015/05/23 职场文书
2016年教师节慰问信
2015/12/01 职场文书
Ajax实现局部刷新的方法实例
2021/03/31 Javascript
TS 类型收窄教程示例详解
2022/09/23 Javascript
Python find()、rfind()方法及作用
2022/12/24 Python