JavaScript 高级程序设计中说:只要代码中不存在 defer 和 async 属性,浏览器都会按照
defer 延迟执行
使用这个属性,脚本会被延迟到整个页面都接续完毕后再运行,相当于告诉浏览区立即下载,但延迟执行。
虽然这个例子中
注意:
(1)延迟脚本不一定会按照顺序执行,也不一定在 DOMContentLoaded 事件前执行,所以最好只包含一个延迟脚本;
(2)defer 属性只适用于外部脚本文件
async 异步脚本
这个属性与 defer 类似,也用于改变处理脚本的行为。但不同的是,标记为 async 的脚本并不保证按照指定他们的先后顺序执行。
以上代码,第二个脚本文件可能会在第一个脚本文件之前执行,因此要确保两者之间互不依赖非常重要。指定 async 属性的目的是不让页面等待两个焦恩下载和执行,从而异步加载页面其他内容。建议异步脚本不要在加载期间修改 DOM。
异步脚本一定会在页面的 load 事件前执行,但可能会在 DOMCintentLoaded 事件触发之前或之后执行。
总结
- 使用 defer 属性可以让脚本在文档完全呈现之后再执行。延迟脚本总是按照指定它们的顺序执行
- 使用 async 属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。但是不能保证异步脚本按照在页面中出现的顺序执行