在脚本标签上使用 defer 或 async 属性会导致其在单独的线程上下载,从而不会阻止 HTML 解析。但是一旦脚本下载完毕,对于 async 属性,它会立即执行。
没有。只有一个线程用于执行 JavaScript(我忽略了 WebWorkers,但必须在代码中显式调用它们)。
不适用,因为第一个问题的答案是否定的。
它会阻塞解析器,但只有在它完成下载脚本之后。因此,解析将与等待脚本下载并行进行。这可能非常重要,因为网络比 CPU 慢得多。
defer
具有与 async
相同的并行优势。但由于它在文档完全解析后才会运行,因此它可以引用文档中加载的任何元素。这类似于将整个脚本放入 DOMContentLoaded
事件的侦听器中(延迟脚本实际上是在该事件触发之前运行,因此它们可以创建侦听器可见的元素)。
如果不使用
async
,解析器会在等待脚本下载 和 执行时被阻塞,而不仅仅是在脚本执行时。