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 相关文章推荐
ExtJs之带图片的下拉列表框插件
Mar 04 Javascript
50个比较实用jQuery代码段
Sep 18 Javascript
深入理解JavaScript系列(13) This? Yes,this!
Jan 18 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
May 12 Javascript
JavaScript中的this机制
Jan 30 Javascript
浅谈String.valueOf()方法的使用
Jun 06 Javascript
js中开关变量使用实例
Feb 24 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
Mar 06 Javascript
Vue2.0表单校验组件vee-validate的使用详解
May 02 Javascript
vue语法之拼接字符串的示例代码
Oct 25 Javascript
JavaScript实现的简单加密解密操作示例
Jun 01 Javascript
vue 项目build错误异常的解决方法
Apr 22 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
全国FM电台频率大全 - 27 陕西省
2020/03/11 无线电
PHP5 面向对象程序设计
2008/02/13 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/01/13 Javascript
jquery 学习笔记一
2010/04/07 Javascript
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
form表单只提交数据而不进行页面跳转的解决方案
2013/09/18 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
js图片放大镜实例讲解(必看篇)
2017/07/17 Javascript
用vue构建多页面应用的示例代码
2017/09/20 Javascript
使用jQuery 操作table 完成单元格合并的实例
2017/12/27 jQuery
ES6小技巧之代替lodash
2019/06/07 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
详解python中的json和字典dict
2018/06/22 Python
python计算列表内各元素的个数实例
2018/06/29 Python
python生成带有表格的图片实例
2019/02/03 Python
python 实现将文件或文件夹用相对路径打包为 tar.gz 文件的方法
2019/06/10 Python
Python笔记之观察者模式
2019/11/20 Python
Python super()函数使用及多重继承
2020/05/06 Python
Python爬虫教程之利用正则表达式匹配网页内容
2020/12/08 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
新闻专业个人求职信
2013/12/19 职场文书
党的群众路线查摆剖析材料
2014/10/10 职场文书
大连星海广场导游词
2015/02/10 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
大学生村官驻村工作心得体会
2016/01/23 职场文书
2019年最新版见习人员管理制度!
2019/07/08 职场文书