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/jquery解析json和数组格式的方法详解
Jan 09 Javascript
js鼠标滑轮滚动事件绑定的简单实例(兼容主流浏览器)
Jan 14 Javascript
javascript实现tab响应式切换特效
Jan 29 Javascript
理解JavaScript原型链
Oct 25 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
Dec 13 Javascript
在点击div中的p时,如何阻止事件冒泡
Feb 07 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
Jan 08 jQuery
vue webpack重写cookie路径的方法
Jul 10 Javascript
解决vue项目中出现Invalid Host header的问题
Nov 17 Javascript
vue3如何优雅的实现移动端登录注册模块
Mar 29 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/03 咖啡文化
php discuz 主题表和回帖表的设计
2009/03/13 PHP
PHP获取MAC地址的具体实例
2013/12/13 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP中捕获超时事件的方法实例
2015/02/12 PHP
PHP+MySQL实现在线测试答题实例
2020/01/02 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
JS弹出对话框返回值代码(asp.net后台)
2010/12/28 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
JS上传图片前实现图片预览效果的方法
2015/03/02 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
JQUERY的AJAX请求缓存里的数据问题处理
2016/02/23 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
Bootstrap table使用方法详细介绍
2016/12/09 Javascript
javascript高级模块化require.js的具体使用方法
2017/10/31 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
实例讲解Vue.js中router传参
2018/04/22 Javascript
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
[48:00]EG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/29 DOTA
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
Django的性能优化实现解析
2019/07/30 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
加拿大最大的书店:Indigo
2017/01/01 全球购物
.NET里面如何取得当前的屏幕分辨率
2012/12/06 面试题
毕业研究生的自我鉴定
2013/11/30 职场文书
党支部书记先进事迹
2014/01/17 职场文书
《自然之道》教学反思
2014/02/11 职场文书
公司经理任命书
2014/06/05 职场文书
单位活动策划方案
2014/08/17 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
修改MySQL的默认密码的四种小方法
2021/05/26 MySQL
Java实战之课程信息管理系统的实现
2022/04/01 Java/Android