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 相关文章推荐
符合标准的js表单提交的代码
Sep 13 Javascript
jQuery实现的在线答题功能
Apr 12 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
javascript三种代码注释方法
Jun 02 Javascript
前端框架Vue.js构建大型应用浅析
Sep 12 Javascript
AngularJS下$http服务Post方法传递json参数的实例
Mar 29 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
Oct 10 Javascript
vue中格式化时间过滤器代码实例
Apr 17 Javascript
js神秘的电报密码 哈弗曼编码实现
Sep 10 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
vue使用element-ui按需引入
May 20 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
第二节 对象模型 [2]
2006/10/09 PHP
PHP字符串的编码问题的详细介绍
2013/04/27 PHP
PHP实现懒加载的方法
2015/03/07 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
php判断某个方法是否存在函数function_exists (),method_exists()与is_callable()区别与用法解析
2020/04/20 PHP
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
js限制checkbox选中个数以限制六个为例
2014/07/15 Javascript
jquery引用方法时传递参数原理分析
2014/10/13 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
jQuery实现自定义右键菜单的树状菜单效果
2015/09/02 Javascript
盘点javascript 正则表达式中 中括号的【坑】
2016/03/16 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
详解webpack自动生成html页面
2017/06/29 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
详解http访问解析流程原理
2017/10/18 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
javascript之分片上传,断点续传的实际项目实现详解
2019/09/05 Javascript
jQuery实现手风琴效果(蒙版)
2020/01/11 jQuery
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
Python算术运算符实例详解
2017/05/31 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
python中学习K-Means和图片压缩
2017/11/20 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
对pycharm 修改程序运行所需内存详解
2018/12/03 Python
python随机在一张图像上截取任意大小图片的方法
2019/01/24 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
波兰最大的儿童服装连锁店之一:5.10.15.
2018/02/11 全球购物
美国最大点评网站:Yelp
2018/02/14 全球购物
党支部书记先进事迹
2014/01/17 职场文书
2014年学校工作总结
2014/11/20 职场文书
祝酒词范文
2015/08/12 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电