当解析器遇到 script 标签时,文档的解析将停止,并立即下载并执行脚本,脚本执行完毕后将继续解析文档。但是我们可以将脚本标记为 defer,这样就不会停止文档解析,等到文档解析完成才执行脚本,也可以将脚本标记为 async,以便由其他线程对脚本进行解析和执行。

三者之间的区别?

script

当解析器遇到 script 标签时,文档的解析将停止,并立即下载并执行脚本,脚本执行完毕后将继续解析文档。

defer script

当解析器遇到 script 标签时,文档的解析不会停止,其他线程将下载脚本,待到文档解析完成,脚本才会执行。

async script

当解析器遇到 script 标签时,文档的解析不会停止,其他线程将下载脚本,脚本下载完成后开始执行脚本,脚本执行的过程中文档将停止解析,直到脚本执行完毕。

什么情况下使用 defer 和 async?

  1. 如果脚本不依赖于任何脚本,并不被任何脚本依赖,那么则使用 defer。
  2. 如果脚本是模块化的,不依赖于任何脚本,那么则使用 async。

需要注意的地方

  1. async 对于内联脚本没有作用。
  2. defer 不应该在内联脚本上使用。从 Gecko 1.9.2 开始,内联脚本的 defer 会被忽略,但是在 Gecko 1.9.1 中,如果定义了 defer 属性,即使内联脚本也会被延迟执行。
  3. defer 的脚本是按照声明顺序执行的。而 async 的脚本不同,只要脚本下载完成,将会立即执行,未必会按照声明顺序执行。
  4. IE9 及以下版本的浏览器,defer 的脚本也未必会按照声明顺序执行。
  5. 如果同时使用 defer 和 async,则会默认使用 async,忽略 defer。

转载于:https://www.cnblogs.com/libin-1/p/5904042.html

JavaScript 的 defer 与 async相关推荐

  1. 浏览器环境下JavaScript脚本加载与执行探析之defer与async特性

    defer和async特性相信是很多JavaScript开发者"熟悉而又不熟悉"的两个特性,从字面上来看,二者的功能很好理解,分别是"延迟脚本"和"异 ...

  2. defer和async属性详解

    script标签的加载是同步执行的,也就是说如果将JavaScript文件放在head标签中时,必须等所有JavaScript代码下载.解析和解释完毕后,才能开始渲染页面 (页面在解析到body标签时 ...

  3. defer和async的原理与区别

    上一篇刚转载了一篇有关于网站性能优化的文章,其中提及到了页面的加载和渲染的过程,提到了defer和async的相关区别,但是本人在此之前并没有深究其中的区别. defer和async是script标签 ...

  4. script标签中的defer和async属性

    默认情况下,浏览器是同步加载 JavaScript 脚本,即渲染引擎遇到<script>标签就会停下来,等到执行完脚本,再继续向下渲染.如果是外部脚本,还必须加入脚本下载的时间. 如果脚本 ...

  5. html5 js阻塞加载,js无阻塞加载和defer、async详解_白峰_前端开发者

    无阻塞加载 把 下载是异步的没问题,但是每个javascript执行的时候还是同步的,就是先出现的script标签一定是先执行,即使是并行下载它是最后一个下载完成的,除非标有defer的script标 ...

  6. html5中defer的属性,HTML5中defer和async的比较

    在网站页面中,通常需要引入外部js资源,然而外部的js资源可能导致DOM阻塞,影响页面加载速度.通过异步或者延迟执行js,可以做到引用外部js资源而不阻塞DOM的目的.用法是直接在script标签中使 ...

  7. script 脚本标签中 defer 和 async (延缓 和 异步)

    原文章:https://segmentfault.com/q/1010000000640869 本文章讲解几个点: <script>  标签中 的 defer 和 async 是什么: 使 ...

  8. JS中script标签defer和async属性的区别

    向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一种直接在script标签之间插入js代码,第二种即是通过src属性引入外部js文件.由于解释器在解 ...

  9. script 标签中的defer 和 async 属性

    浏览器在解析 HTML 的时候,如果遇到一个没有任何属性的 <script> 标签 ,就会暂停解析,先发送网络请求获取该 JS 脚本的代码内容,然后让 JS 引擎执行该代码,当代码执行完毕 ...

最新文章

  1. Mysql5.7使用注意事项随笔
  2. 玩远程 可视对讲系统几大新兴应用分析
  3. 在Linux中远程通过ip和端口号以及密码登录redis的命令
  4. 图解LSTM神经网络架构及其11种变体(附论文)
  5. 前端和后端哪个工资高_嵌入式软硬件工程师哪个更有前途,工资还高
  6. 被虐惨!还热乎的腾讯后端一面面经分享!
  7. 使用apache的poi生成本地Excel文件(二)
  8. VS中,DEBUG/RELEASE的宏定义不同引起的问题
  9. duilib列表list使用方法
  10. python计算2的n次方编写_python中n次方怎么表示
  11. JAVA最佳学习方法
  12. Codefoeces 581B Luxurious Houses
  13. 猛男插件!csdn浏览器助手到底怎样!(整合全网评价)
  14. 坎坎坷坷的深度学习之路(一)-环境搭建
  15. 中科大2021计算机考研分数线,中国科学技术大学2021年考研复试各科分数线_中国科大考多少分能进复试-聚创中国科大考研网...
  16. 射频通信中的CA中的PCC和SCC概念
  17. 王者荣耀关注显示服务器忙,王者荣耀不满足参加该活动的条件 访问繁忙解决方法...
  18. SpringBoot整合邮件发送
  19. 一种ESP8266使用MQTT连接阿里云和云Web方法
  20. 『 kaggle』kaggle-DATA-SCIENCE-BOWL-2018(U-net方法)

热门文章

  1. mysql的area_GitHub - nszm/china_area_mysql: 中国5级行政区域mysql库
  2. Python生成exe可执行文件的两种方法(py2exe和pyinstaller)
  3. pdf打印显示spoolsv.exe-应用程序错误的原因和解决方法
  4. 反向链接referrer的原理
  5. (https)nginx - tomcat(http)
  6. MAC/Linux 下 Git 记住用户名密码
  7. 类继承和初始化类的执行顺序
  8. (20120731)Android中的各种对话框总结(dialog)
  9. URAL 1806 Mobile Telegraphs
  10. PAT1021. 个位数统计