真正的答案是:因为您不能相信延期。
在概念上,延迟和异步的区别如下:
异步允许脚本在后台下载而不会阻塞。然后,在完成下载的那一刻,渲染被阻止并且该脚本执行。执行脚本后,将继续渲染。
除了声明可以保证脚本按在页面上指定的顺序执行以及声明将在文档解析完成后执行之外,defer的作用相同。因此,某些脚本可能会完成下载,然后坐下来等待后来下载但出现在它们之前的脚本。
不幸的是,由于实际上是一场标准的斗争,defer的定义因规格而异,甚至在最新的规格中也无法提供有用的保证。由于答案在这里和这个问题表明,浏览器实现延迟是不同的:
- 在某些情况下,某些浏览器会存在一个错误,导致
defer
脚本无法正常运行。
- 有些浏览器将
DOMContentLoaded
事件延迟到defer
脚本加载之后,有些则没有。
- 有些浏览器服从
defer
于<script>
与内嵌代码,并没有元素src
属性,有些忽略它。
幸运的是,规范至少指定了异步优先于延迟。因此,您可以将所有脚本视为异步脚本,并获得广泛的浏览器支持,如下所示:
<script defer async src="..."></script>
全球使用的浏览器中有98%,在美国使用的浏览器中有99%将避免使用此方法进行阻止。
(如果您需要等到文档完成解析后,请监听事件DOMContentLoaded
事件或使用jQuery的便捷.ready()
功能。无论如何,您都希望这样做,以在根本不实现的浏览器上优雅地返回defer
。)