<script>标签属性async 和defer 有什么不一样
script脚本默认是按顺序同步执行的,如果在html头部引入了2个脚本文件,它们会按顺序依次往下执行完,阻塞页面的渲染,所以这时候脚本内有获取dom的操作是获取不到页面元素的。
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="./s01.js"></script>
<script src="./s02.js"></script>
</head>
// s01.js
const dom = document.getElementById("btn");
console.log(dom);
console.log("s01.js");
如果给script标签加上async标签,它会立即下载,下载完立即执行。不会阻塞其他资源的加载,如果下载速度快于文档加载速度,那脚本里就可以获取到页面元素。
<script src="./s01.js" async></script>
还有一个defer属性,它会等到文档解析完成再执行,并且多个写有defer属性的脚本,它们会按顺序加载执行。
<script src="./s01.js" defer></script>