JS中script标签defer和async属性的区别详解


Posted in Javascript onAugust 12, 2016

向html页面中插入javascript代码的主要方法就是通过script标签。其中包括两种形式,第一种直接在script标签之间插入js代码,第二种即是通过src属性引入外部js文件。由于解释器在解析执行js代码期间会阻塞页面其余部分的渲染,对于存在大量js代码的页面来说会导致浏览器出现长时间的空白和延迟,为了避免这个问题,建议把全部的js引用放在</body>标签之前。

script标签存在两个属性,defer和async,因此script标签的使用分为三种情况:

1.<script src="example.js"></script>

 没有defer或async属性,浏览器会立即加载并执行相应的脚本。也就是说在渲染script标签之后的文档之前,不等待后续加载的文档元素,读到就开始加载和执行,此举会阻塞后续文档的加载;

  2.<script async src="example.js"></script>

有了async属性,表示后续文档的加载和渲染与js脚本的加载和执行是并行进行的,即异步执行;

3.<script defer src="example.js"></script>

有了defer属性,加载后续文档的过程和js脚本的加载(此时仅加载不执行)是并行进行的(异步),js脚本的执行需要等到文档所有元素解析完成之后,DOMContentLoaded事件触发执行之前。

下图可以直观的看出三者之间的区别:

JS中script标签defer和async属性的区别详解

其中蓝色代表js脚本网络加载时间,红色代表js脚本执行时间,绿色代表html解析。

从图中我们可以明确一下几点:

1.defer和async在网络加载过程是一致的,都是异步执行的;

2.两者的区别在于脚本加载完成之后何时执行,可以看出defer更符合大多数场景对应用脚本加载和执行的要求;

3.如果存在多个有defer属性的脚本,那么它们是按照加载顺序执行脚本的;而对于async,它的加载和执行是紧紧挨着的,无论声明顺序如何,只要加载完成就立刻执行,它对于应用脚本用处不大,因为它完全不考虑依赖。

小结:

defer 和 async 的共同点是都是可以并行加载JS文件,不会阻塞页面的加载,不同点是 defer的加载完成之后,JS会等待整个页面全部加载完成了再执行,而async是加载完成之后,会马上执行JS,所以假如对JS的执行有严格顺序的话,那么建议用 defer加载。

以上所述是小编给大家介绍的JS中script标签defer和async属性的区别详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery 行级解析读取XML文件(附源码)
Oct 12 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
jquery移动点击的项目到列表最顶端的方法
Jun 24 Javascript
js控制li的隐藏和显示实例代码
Oct 15 Javascript
Node.js 实现简单小说爬虫实例
Nov 18 Javascript
jQuery实现鼠标跟随效果
Feb 20 Javascript
jQuery插件FusionCharts绘制2D双折线图效果示例【附demo源码】
Apr 14 jQuery
bootstrap模态框嵌套、tabindex属性、去除阴影的示例代码
Oct 17 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
May 17 Javascript
详解JavaScript 浮点数运算的精度问题
Jul 23 Javascript
Node.js API详解之 timer模块用法实例分析
May 07 Javascript
解决Vue-cli无法编译es6的问题
Oct 30 Javascript
jquery实现网站列表切换效果的2种方法
Aug 12 #Javascript
很实用的js选项卡切换效果
Aug 12 #Javascript
js实现浏览器倒计时跳转页面效果
Aug 12 #Javascript
javascript实现瀑布流动态加载图片原理
Aug 12 #Javascript
jquery实现垂直和水平菜单导航栏
Aug 27 #Javascript
JS实现图片剪裁并预览效果
Aug 12 #Javascript
JS数组去掉重复数据只保留一条的实现代码
Aug 11 #Javascript
You might like
php实现ping
2006/10/09 PHP
PHP开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
基于PHP异步执行的常用方式详解
2013/06/03 PHP
jQuery ReferenceError: $ is not defined 错误的处理办法
2013/05/10 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
jQuery层动画定位滑动效果的方法
2015/04/30 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
JS实现iframe自适应高度的方法示例
2017/01/07 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
vue v-on监听事件详解
2017/05/17 Javascript
原生js获取left值和top值的三种方法
2017/08/02 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
javascript实现贪吃蛇游戏(娱乐版)
2020/08/17 Javascript
[48:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 VG vs KG
2018/03/31 DOTA
python实现rsa加密实例详解
2017/07/19 Python
使用Django2快速开发Web项目的详细步骤
2019/01/06 Python
对python while循环和双重循环的实例详解
2019/08/23 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
2020/03/09 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
html5实现九宫格抽奖可固定抽中某项奖品
2020/06/15 HTML / CSS
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
德国大型箱包和皮具商店:Koffer
2019/10/01 全球购物
恒华伟业笔试面试题
2015/02/26 面试题
幼师求职自荐信范文
2014/01/26 职场文书
求职者怎样写自荐信
2014/04/13 职场文书
小学综合实践活动总结
2014/07/07 职场文书
法人代表授权委托书范文
2014/09/10 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
张丽莉观后感
2015/06/16 职场文书
同学聚会祝酒词
2015/08/10 职场文书
周一给客户的问候语
2015/11/10 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android