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 相关文章推荐
js获取html文件的思路及示例
Sep 17 Javascript
JS对象与json字符串格式转换实例
Oct 28 Javascript
js获取当前日期时间及其它日期操作汇总
Mar 08 Javascript
EasyUI折叠表格层次显示detailview详解及实例
Dec 28 Javascript
React组件的三种写法总结
Jan 12 Javascript
微信小程序 封装http请求实例详解
Jan 16 Javascript
vue 实现通过手机发送短信验证码注册功能
Apr 19 Javascript
详解Angular操作cookies方法
Jun 01 Javascript
vuex提交state&amp;&amp;实时监听state数据的改变方法
Sep 16 Javascript
使用angular-cli webpack创建多个包的方法
Oct 16 Javascript
JavaScript实现新年倒计时效果
Nov 17 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
Nov 04 jQuery
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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
详解Yii2.0使用AR联表查询实例
2017/06/16 PHP
JS 文件大小判断的实现代码
2010/04/07 Javascript
利用NodeJS和PhantomJS抓取网站页面信息以及网站截图
2013/11/18 NodeJs
jquery.cookie用法详细解析
2013/12/18 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
2019/05/22 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
python使用循环实现批量创建文件夹示例
2014/03/25 Python
python基础教程之Filter使用方法
2017/01/17 Python
python matplotlib画图实例代码分享
2017/12/27 Python
理论讲解python多进程并发编程
2018/02/09 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
2019/10/01 Python
下载官网python并安装的步骤详解
2019/10/12 Python
python实发邮件实例详解
2019/11/11 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
Python就将所有的英文单词首字母变成大写
2021/02/12 Python
python 如何在测试中使用 Mock
2021/03/01 Python
美国著名的家居用品购物网站:Bed Bath & Beyond
2018/01/05 全球购物
西班牙多品牌鞋店连锁店:Krack
2018/11/30 全球购物
中医专业应届生求职信
2013/11/17 职场文书
法律进机关实施方案
2014/03/12 职场文书
企业承诺书怎么写
2014/05/24 职场文书
国庆促销活动总结
2014/08/29 职场文书
干部四风问题整改措施思想汇报
2014/10/13 职场文书
班主任工作实习计划
2015/01/16 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
义诊活动通知
2015/04/24 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
护士年终工作总结不会写?各科护士模板总结
2020/01/02 职场文书