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 跨域访问问题解决方法
Dec 02 Javascript
JavaScript DOM学习第六章 表单实例
Feb 19 Javascript
jquery插件制作教程 txtHover
Aug 17 Javascript
用javascript将数据导入Excel示例代码
Sep 10 Javascript
jQuery中outerHeight()方法用法实例
Jan 19 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
JS获取屏幕高度的简单实现代码
May 24 Javascript
JavaScript之iterable_动力节点Java学院整理
Jun 29 Javascript
jQuery ajax调用webservice注意事项
Oct 08 jQuery
vue2.0 自定义 饼状图 (Echarts)组件的方法
Mar 02 Javascript
Vue 中使用 typescript的方法详解
Feb 17 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
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经典的给图片加水印程序
2006/12/06 PHP
php实现数据库的增删改查
2017/02/26 PHP
PHP开发中csrf攻击的简单演示和防范
2017/05/07 PHP
php-fpm开启状态统计的方法详解
2017/06/23 PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
2018/04/12 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
用js写的一个路由(简单实例)
2016/09/24 Javascript
js调用屏幕宽度的简单方法
2016/11/14 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
利用require.js与angular搭建spa应用的方法实例
2017/07/19 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
JS中Map和ForEach的区别
2018/02/05 Javascript
解决在vue项目中webpack打包后字体不生效的问题
2018/09/01 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
在python里面运用多继承方法详解
2019/07/01 Python
浅谈Python的方法解析顺序(MRO)
2020/03/05 Python
马来西亚最热门的在线时尚商店:FashionValet
2018/11/11 全球购物
俄罗斯游戏商店:Buka
2020/03/01 全球购物
Python文件操作的面试题
2013/06/22 面试题
高分子材料个人求职信范文
2013/09/25 职场文书
学生评语大全
2014/04/18 职场文书
质量承诺书格式
2014/05/20 职场文书
小学生运动会报道稿
2014/09/12 职场文书
国庆节标语大全
2014/10/08 职场文书
简单租房协议书(范本)
2014/10/13 职场文书
先进员工事迹材料
2014/12/20 职场文书
质检员工作总结2015
2015/04/25 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
MySQL为数据表建立索引的原则详解
2022/03/03 MySQL