① async: 异步加载对应的javascript脚本,不阻塞HTML页面的渲染,当对应的javascript加载完成后,如果此时HTML页面还未加载完成,那么会阻塞页面的渲染,等javascript执行完成后再继续HTML页面的加载。这意味着脚本的执行可能发生在页面解析完毕之前或之后,具体取决于脚本下载的速度。如果多个脚本都有 async 属性,它们的执行顺序将是不确定的。
② defer: 异步加载对应的javascript脚本,不阻塞HTML页面的渲染,当对应的javascript加载完成后,如果此时HTML页面还未加载完成,那么不会阻塞页面的渲染,等HTML页面加载完成后再接着执行加载完成的javascript脚本。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。 因此,在元素中设置 defer属性, 相当于告诉浏览器立即下载,但延迟执行。与 async 不同,多个带有 defer 属性的脚本会按照它们在页面中出现的顺序执行。
async:async只适用于外部脚本文件,并告诉浏览器立即下载文件。但与defer 不同的是, 标记为async的脚本并不保证按照指定它们的先后顺序执行。
会异步加载脚本文件,但不会阻止文档的解析。
一旦脚本下载完成,立即执行,不考虑它们在文档中的位置,可能会在文档解析完成前或后执行。
多个带有async 属性的脚本的执行顺序是不确定的,取决于它们下载完成的顺序。
由于两个 script标签都带有 async属性,这意味着它们会并行加载,不会等待前一个脚本加载完成才开始加载下一个脚本。
这可以提高页面加载性能,因为浏览器可以同时下载多个资源,而不必等待一个资源的下载完成。
总结:
当script中有defer属性时,脚本的加载过程和文档加载是异步发生的,等到文档解析完脚本才开始执行。先html后脚本
当script有async属性时,脚本的加载过程和文档加载也是异步发生的。但脚本下载完成后会停止HTML解析,执行脚本,脚本解析完继续HTML解析。
当script同时有async和defer属性时,执行效果和async一致。
使用场景:
广告代码:与第三方分析代码类似,广告脚本通常不是页面主要内容的一部分,因此可以使用 加载,以免延迟页面渲染。async
选择使用 async 还是 defer 取决于脚本的执行时机和依赖关系。如果脚本不依赖于页面的其余部分,而且可以独立运行,那么可以考虑使用 async。如果脚本需要在整个文档解析完成后执行,或者依赖于其他脚本,那么可以使用 defer。如果脚本需要立即执行且不依赖于页面的其余内容,可以使用普通的