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 Demo模态窗口
Dec 06 Javascript
jquery $.ajax()取xml数据的小问题解决方法
Nov 20 Javascript
Js四则运算函数代码
Jul 21 Javascript
使用js简单实现了tree树菜单
Nov 20 Javascript
Node.js中require的工作原理浅析
Jun 24 Javascript
javascript中SetInterval与setTimeout的定时器用法
Aug 24 Javascript
Bootstrap每天必学之媒体对象
Nov 30 Javascript
值得分享的JavaScript实现图片轮播组件
Nov 21 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
Vue如何实现响应式系统
Jul 11 Javascript
初学node.js中实现删除用户路由
May 27 Javascript
BootstrapValidator验证用户名已存在(ajax)
Nov 08 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多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
PHP多维数组指定多字段排序的示例代码
2018/05/16 PHP
PHP PDOStatement::fetch讲解
2019/01/31 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
JavaScript Base64编码和解码,实现URL参数传递。
2006/09/18 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
AngularJS快速入门
2015/04/02 Javascript
javascript原型继承工作原理和实例详解
2016/04/07 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
JavaScript编写棋盘覆盖代码详解
2017/08/28 Javascript
在Vue中使用echarts的方法
2018/02/05 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
JS中的JSON对象的定义和取值实现代码
2018/05/09 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
解决更改AUTH_USER_MODEL后出现的问题
2020/05/14 Python
python中Ansible模块的Playbook的具体使用
2020/05/28 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
adidas旗下高尔夫装备供应商:TaylorMade Golf(泰勒梅高尔夫)
2016/08/28 全球购物
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
科室工作的个人自我评价
2013/10/30 职场文书
寄语十八大感言
2014/02/07 职场文书
网络编辑职责
2014/03/01 职场文书
社团活动总结
2014/04/28 职场文书
故意杀人案辩护词
2015/05/21 职场文书
Java数据开发辅助工具Docker与普通程序使用方法
2021/09/15 Java/Android