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字符编码函数区别分析
Jun 05 Javascript
javascript向后台传送相同属性的参数即数组参数
Feb 17 Javascript
node.js中的fs.openSync方法使用说明
Dec 17 Javascript
简介JavaScript中getUTCMonth()方法的使用
Jun 10 Javascript
js游戏人物上下左右跑步效果代码分享
Aug 28 Javascript
SpringMVC简单整合Angular2的示例
Jul 31 Javascript
微信小程序实现添加手机联系人功能示例
Nov 30 Javascript
layui 表格的属性的显示转换方法
Aug 14 Javascript
微信小程序之swiper滑动面板用法示例
Dec 04 Javascript
Vue CLI3中使用compass normalize的方法
May 30 Javascript
vue 实现滚动到底部翻页效果(pc端)
Jul 31 Javascript
js贪心算法 钱币找零问题代码实例
Sep 11 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常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
jQuery的position()方法详解
2015/07/19 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
微信小程序 基础组件与导航组件详细介绍
2017/02/21 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
react native与webview通信的示例代码
2017/09/25 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
vue中的provide/inject的学习使用
2018/05/09 Javascript
在小程序/mpvue中使用flyio发起网络请求的方法
2018/09/13 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
Bootstarp在pycharm中的安装及简单的使用方法
2019/04/19 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
不要用强制方法杀掉python线程
2017/02/26 Python
python中cPickle类使用方法详解
2018/08/27 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
CSS3属性box-shadow使用指南
2014/12/09 HTML / CSS
Mamas & Papas沙特阿拉伯:英国最受欢迎的婴儿品牌
2017/11/20 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
PHP如何删除一个Cookie值
2012/11/15 面试题
酒店管理专业毕业生推荐信
2013/11/10 职场文书
服务中心夜班服务员岗位职责
2013/11/27 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
车辆委托书范本
2014/10/05 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
运动会通讯稿200字
2015/07/20 职场文书
学校2016年全国助残日活动总结
2016/04/01 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL