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框架
Aug 13 Javascript
Javascript的常规数组和关联数组对比小结
May 24 Javascript
Asp.Net alert弹出提示信息的几种方法总结
Jan 29 Javascript
node.js中的url.parse方法使用说明
Dec 10 Javascript
javascript中Object使用详解
Jan 26 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
Mar 04 Javascript
BootStrap实现手机端轮播图左右滑动事件
Oct 13 Javascript
Vue 实用分页paging实例代码
Apr 12 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
小程序调用微信支付的方法
Sep 26 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 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 动态随机生成验证码类代码
2010/04/09 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
2016/02/14 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
PHP获取当前页面完整URL的方法
2016/12/02 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
javascript实现文字无缝滚动效果
2017/08/26 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
python3图片转换二进制存入mysql
2013/12/06 Python
Python 异常处理实例详解
2014/03/12 Python
python3 pillow生成简单验证码图片的示例
2017/09/19 Python
详解python eval函数的妙用
2017/11/16 Python
Python正则表达式和re库知识点总结
2019/02/11 Python
Django 内置权限扩展案例详解
2019/03/04 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
基于CSS3的CSS 多栏(Multi-column)实现瀑布流源码分享
2014/06/11 HTML / CSS
举例详解CSS3中的Transition
2015/07/15 HTML / CSS
美国在线鲜花速递:ProFlowers
2017/01/05 全球购物
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
Arti-shopping中文官网:大型海外商品一站式直邮平台
2020/03/23 全球购物
人事科岗位职责范本
2014/03/02 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
外语系毕业生求职自荐信
2014/04/12 职场文书
房地产广告策划方案
2014/05/15 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书