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学习笔记之获取当前目录的实现代码
Dec 14 Javascript
无阻塞加载脚本分析[全]
Jan 20 Javascript
javascript获得服务器端控件的ID的实现代码
Dec 28 Javascript
js+css实现的简单易用兼容好的分页
Dec 30 Javascript
iframe父页面获取子页面参数的方法
Feb 21 Javascript
点击表单提交时出现jQuery没有权限的解决方法
Jul 23 Javascript
如何编写高质量JS代码
Dec 28 Javascript
Node.js事件的正确使用方法
Apr 05 Javascript
Javascript Dom元素获取和添加详解
Sep 24 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
详解JavaScript类型判断的四种方法
Oct 21 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
Jan 19 Vue.js
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 数组教程 定义数组
2009/10/23 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
基于PHP一些十分严重的缺陷详解
2013/06/03 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
php中time()和mktime()方法的区别
2013/09/28 PHP
ThinkPHP中的常用查询语言汇总
2014/08/22 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
分析php://output和php://stdout的区别
2018/05/06 PHP
php 中htmlentities导致中文无法查询问题
2018/09/10 PHP
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
jQuery回车实现登录简单实现
2013/08/20 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
ionic开发中点击input时键盘自动弹出
2016/12/23 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
js如何获取网页所有图片
2017/05/12 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
vue购物车插件编写代码
2017/11/27 Javascript
详解vue中async-await的使用误区
2018/12/05 Javascript
vue实现数字滚动效果
2020/06/29 Javascript
[30:55]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第二场 11.18
2020/11/18 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
PyQt5每天必学之日历控件QCalendarWidget
2018/04/19 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
利用Python实现Json序列化库的方法步骤
2020/09/09 Python
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
金融专业毕业生推荐信
2013/11/26 职场文书
中式面点餐厅创业计划书
2014/01/29 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
学前班语言教学计划
2015/01/20 职场文书
社会实践活动总结格式
2015/05/11 职场文书
初中运动会闭幕词范本3篇
2019/12/09 职场文书
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js
MYSQL如何查看操作日志详解
2022/05/30 MySQL