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 技巧大全(新手入门篇)
May 12 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
Nov 09 Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 Javascript
判断在css加载完毕后执行后续代码示例
Sep 03 Javascript
jQuery中:not选择器用法实例
Dec 30 Javascript
解决WordPress使用CDN后博文无法评论的错误
Dec 15 Javascript
jQuery实现表格与ckeckbox的全选与单选功能
Nov 24 Javascript
jQuery实现动态添加tr到table的方法
Dec 26 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
element ui table(表格)实现点击一行展开功能
Dec 04 Javascript
Vue在 Nuxt.js 中重定向 404 页面的方法
Apr 23 Javascript
微信小程序实现购物车功能
Nov 18 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中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
2016/03/21 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
Laravel中批量赋值Mass-Assignment的真正含义详解
2017/09/29 PHP
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
LazyLoad 延迟加载(按需加载)
2010/05/31 Javascript
yepnope.js 异步加载资源文件
2011/09/08 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
vue项目中api接口管理总结
2018/04/20 Javascript
vue使用自定义icon图标的方法
2018/05/14 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
Jquery Datatables的使用详解
2020/01/30 jQuery
js实现表格数据搜索
2020/08/09 Javascript
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
简单实现Python爬取网络图片
2018/04/01 Python
Python Requests库基本用法示例
2018/08/20 Python
python 移动图片到另外一个文件夹的实例
2019/01/10 Python
在Python 字典中一键对应多个值的实例
2019/02/03 Python
PyQt5 多窗口连接实例
2019/06/19 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
基于python代码批量处理图片resize
2020/06/04 Python
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
党员违纪检讨书怎么写
2014/11/01 职场文书
会计电算化实训报告
2014/11/04 职场文书
2014年政协工作总结
2014/12/09 职场文书
人生感悟经典句子
2019/08/20 职场文书
Java实现聊天机器人完善版
2021/07/04 Java/Android
MySQL索引是啥?不懂就问
2021/07/21 MySQL