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函数般调用正则
Apr 08 Javascript
ExtJS GTGrid 简单用户管理
Jul 01 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
Apr 13 Javascript
jQuery中调用WebService方法小结
Mar 28 Javascript
js实现上传图片预览的方法
Feb 09 Javascript
详解js中构造流程图的核心技术JsPlumb
Dec 08 Javascript
javascript对象的相关操作小结
May 16 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
详谈Node.js之操作文件系统
Aug 29 Javascript
使用layer弹窗和layui表单实现新增功能
Aug 09 Javascript
从零开始用electron手撸一个截屏工具的示例代码
Oct 10 Javascript
Vue 自定义标签的src属性不能使用相对路径的解决
Sep 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
php实现文件编码批量转换
2014/03/10 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
php中使用sftp教程
2015/03/30 PHP
PHP邮箱验证示例教程
2016/06/01 PHP
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
Bootstrap实现提示框和弹出框效果
2017/01/11 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
Vue列表渲染的示例代码
2018/11/01 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
JS前端知识点offset,scroll,client,冒泡,事件对象的应用整理总结
2019/06/27 Javascript
关于layui 实现点击按钮添加一行(方法渲染创建的table)
2019/09/29 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Python写的Socks5协议代理服务器
2014/08/06 Python
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
Python中顺序表的实现简单代码分享
2018/01/09 Python
python支持多线程的爬虫实例
2019/12/21 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
tensorflow 查看梯度方式
2020/02/04 Python
python交互模式基础知识点学习
2020/06/18 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
法律专业推荐信范文
2013/11/29 职场文书
寒假思想汇报
2014/01/10 职场文书
医药销售求职信范文
2014/02/01 职场文书
会计专业自荐信
2014/06/03 职场文书
雷人标语集锦
2014/06/19 职场文书
2014年综合治理工作总结
2014/11/20 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
房租涨价通知
2015/04/23 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
2015小学师德工作总结
2015/07/21 职场文书
趣味运动会赞词
2015/07/22 职场文书