defer
HTML 4.01 为<script>标签定义了 defer 属性。
这个属性的用途是表明脚本在执行时不会影响页面的构造。
也就是说,脚本会被延迟到整个页面都解析完毕后再运行。
因此,在<script>元素中设置defer 属性,相当于告诉浏览器立即下载,但延迟执行。
HTML5 规范要求脚本按照它们出现的先后顺序执行,因此第一个加载脚本会先于第二个加载脚本执行,而这两个脚本会先于 DOMContentLoaded 事件执行。
在现实当中,延迟脚本并不一定会按照顺序执行,也不一定会在 DOMContentLoaded 事件触发前执行,因此最好只包含一个延迟脚本。
前面提到过, defer 属性只适用于外部脚本文件。这一点在 HTML5 中已经明确规定,因此支持HTML5 的实现会忽略给嵌入脚本设置的 defer 属性。 IE4~IE7 还支持对嵌入脚本的 defer 属性,但IE8 及之后版本则完全支持 HTML5 规定的行为。
IE4、 Firefox 3.5、 Safari 5 和 Chrome 是最早支持 defer 属性的浏览器。其他浏览器会忽略这个属性,像平常一样处理脚本。为此,把延迟脚本放在页面底部仍然是最佳选择。
async
HTML5 为<script>元素定义了 async 属性。这个属性与 defer 属性类似,都用于改变处理脚本的行为。
同样与 defer 类似, async 只适用于外部脚本文件,并告诉浏览器立即下载文件。
但与 defer不同的是,标记为 async 的脚本并不保证按照指定它们的先后顺序执行。
第二个加载的脚本文件可能会在第一个加载的脚本文件之前执行。
因此,确保两者之间互不依赖非常重要。
指定 async 属性的目的是不让页面等待两个脚本下载和执行,从而异步加载页面其他内容。
为此,建议异步脚本不要在加载期间修改 DOM。
异步脚本一定会在页面的 load 事件前执行,但可能会在 DOMContentLoaded 事件触发之前或之后执行。
支持异步脚本的浏览器有 Firefox 3.6、 Safari 5 和 Chrome。
因此在最新的HTML5标准下defer这个属性是会被忽略掉的、是无效的、除非你还需要兼容IE8以前的浏览器、这对当前大多数网页来说这是没有意义的。
所以更推荐使用async、当然这不是最好的方式、因为你无法控制它的加载顺序、如果你的JS文件存在依赖关系的话,那将是一个非常糟糕的事情、我更喜欢使用动态创建script标签的方式来做延迟加载,当然方式不止一种、希望你能找到自己喜欢的方式。如果还有什么不懂可以来联系我
by潇潇暮雨