每日一题: script标签中的defer和async区别

262 阅读1分钟

每日一题:script标签中的defer和async区别

前言

大家好,我是JOJO。梦想是每天睡到自然醒!

今天呢,跟大家分享一道面试题:

问: script标签中的defer和async有什么区别、或者说有什么用?

这道题呢?其实并不难,基本上看下文档介绍、都能回答出来。但是呢,俩这概念很相近,很容易记乱。下面们就一起来学习一下!

题目

script标签中的defer和async有什么区别、或者说有什么用?

分析

首先呢,我们都知道script标签是用来加载和执行js脚本的。

defer从字面来说是推迟的意思,async则是异步的意思;

下面呢,我们结合一张很清晰的图来说明(图片来源网络)

WX20220505-140533@2x.png

  • 绿色 表示html的解析
  • 蓝色 表示加载js
  • 红色 表示执行js

从这张图,我们可以看到在不同script属性下,js的执行线程,和html解析线程发生的过程不一样;

提示

html解析和js的执行是互斥的。

通过上面的解释,我们可以发现

默认:

暂停html解析,下载JS,执行JS,继续解析html

defer属性

继续html解析,异步下载js,html解析完后在执行js。

(这个机制,和把script放到body标签内部最后、是一个道理)

async属性

继续html解析,异步下载js,执行js,html继续解析

总结

deferasync 都是异步加载js,性能会高于默认的script加载!

区别在js的执行时间,defer是等html解析完在执行。async则是在下载完就执行!

现在,大家都很清晰了吧!

\