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 相关文章推荐
浅谈JavaScript 框架分类
Nov 10 Javascript
JQuery的ON()方法支持的所有事件罗列
Feb 28 Javascript
jQuery移动端日期(datedropper)和时间(timedropper)选择器附源码下载
Apr 19 Javascript
一系列Bootstrap导航条使用方法分享
Apr 29 Javascript
JS中如何实现点击a标签返回页面顶部的问题
Jan 19 Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 jQuery
基于vue.js的分页插件详解
Nov 27 Javascript
解决vue 绑定对象内点击事件失效问题
Sep 05 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
简单了解JavaScript中的执行上下文和堆栈
Jun 24 Javascript
javascript实现时间日期的格式化的方法汇总
Aug 06 Javascript
vscode自定义vue模板的实现
Jan 27 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中去除所有js,html,css代码
2010/10/12 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php实现登录页面的简单实例
2019/09/29 PHP
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
JavaScript中的fontsize()方法使用详解
2015/06/08 Javascript
js实现的简单radio背景颜色选择器代码
2015/08/18 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
vue中的scope使用详解
2017/10/29 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
详解ajax的data参数错误导致页面崩溃
2018/04/30 Javascript
基于jQuery.i18n实现web前端的国际化
2018/05/04 jQuery
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
Vue 开发必须知道的36个技巧(小结)
2019/10/09 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
Python实现的爬取网易动态评论操作示例
2018/06/06 Python
Python实现获取邮箱内容并解析的方法示例
2018/06/16 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
css3动画效果抖动解决方法
2018/09/03 HTML / CSS
日本最大的眼镜购物网站:Oh My Glasses
2016/11/13 全球购物
次世代生活态度:Hypebeast
2018/07/05 全球购物
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
北大自主招生自荐信
2013/10/19 职场文书
医科大学生的自我评价
2013/12/04 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
成语的广告词
2014/03/19 职场文书
矿泉水广告词
2014/03/20 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
2015年社区科普工作总结
2015/05/13 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
python自动化之如何利用allure生成测试报告
2021/05/02 Python