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


3 async特性
3.1 关于async脚本的执行时机
async特性是HTML5中引入的特性,使用方式为:async="async",我们首先看一下标准中对于async特性的相关描述:
async:If the async attribute is present, then the script will be executed asynchronously, as soon as it is available.
需要指出,这里的异步,指的其实是异步加载而不是异步执行,也就是说,浏览器遇到一个async的script标签时,会异步的去加载(个人认为这个过程主要是下载的过程),一旦加载完毕就会执行代码,而执行的过程肯定还是同步的,也就是阻塞的 。我们可以通过下图来综合理解defer和async:

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


这样来看的话,async脚本的执行时机是无法确定的,因为脚本何时加载完毕也是不确定的 。我们通过下面的demo来感受一下:
async1.js
alert("我是异步的脚本");
HTML代码:
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性


这里我们借用了《浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序》中的delayfile脚本来提供了一个延迟,这个脚本在支持async的浏览器中,弹框的顺序一般是:我是同步的脚本-》我是异步的脚本 。
3.2 async的浏览器支持情况
下面我们来看一下async特性的浏览器支持情况:
浏览器环境下JavaScript脚本加载与执行探析之defer与async特性


可以看到,只有IE10 才支持async特性,opera mini不支持async特性,另外,async是不支持内部脚本的 。
3.3 async总结
async指的异步脚本,即脚本异步加载,加载的过程不会造成阻塞,但是async的脚本的执行时机是不确定的,而且执行的顺序也是不确定的,因此使用async的脚本应该是不依赖于任何代码的脚本(比如第三方统计代码或广告代码),否则就会导致执行出错 。
4 defer和async的优先级问题
这一点比较好理解,标准中规定了:
【浏览器环境下JavaScript脚本加载与执行探析之defer与async特性】[1]如果

推荐阅读