Javascript 使用document.write下载和执行脚本的顺序

Javascript 使用document.write下载和执行脚本的顺序,javascript,execution,document.write,Javascript,Execution,Document.write,我有以下代码: <script> document.write('<script src="1.js"><\/script>'); </script> <script> document.write('<script src="2.js"><\/script>'); </script> <script src="3.js"></script> 文件。写(“”

我有以下代码:

<script>
    document.write('<script src="1.js"><\/script>');
</script>
<script>
    document.write('<script src="2.js"><\/script>');
</script>
<script src="3.js"></script>

文件。写(“”);
文件。写(“”);
在网络控制台中,我可以看到
3.js
是在
1.js
2.js
之前下载的。但是,执行顺序与预期一致(
1.js
2.js
3.js

据我所知,
document.write
被阻塞了,所以应该在调用
document.write
之后下载脚本
3.js


为什么
3.js
在插入
document.write
的脚本之前下载

执行顺序是有保证的,因为。如果脚本具有尚未下载的
src
URL(请参见下文),则必须先下载,然后才能解析脚本。这是个坏消息——这意味着HTML解析器无法继续读取文档,因为它正在等待可能较慢的HTTP响应

在您的示例中,HTML解析器必须等待第一个内联
执行完毕,然后才能转到下一个输入

执行后,下一个输入是插入到文档中的
。HTML解析器会在获取、解析和执行过程中进行阻塞,然后再转移到下一个内联脚本,以此类推。这将导致执行顺序:

  • document.write(“”)
  • document.write(“”)
  • 但是,浏览器可以自由决定何时以及如何下载资源。这可以独立于脚本执行的顺序

    对于现代浏览器来说,减少HTML解析器在脚本下载时被阻止的时间是很常见的

    您看到的是先下载的
    3.js
    ,因为浏览器扫描浏览器中的资产并立即开始下载脚本。HTML解析器解析并执行相应的内联
    脚本
    标记后,它才能开始下载
    1.js
    2.js

    这意味着HTML解析器在下载
    1.js
    2.js
    时被阻止。如果您的所有脚本都像
    3.js
    那样被直接包含,那么浏览器很可能会并行地预取这三个脚本,从而使页面加载更加高效


    预取实现是特定于浏览器的,因此您可能会在其他浏览器中看到不同的结果。

    欢迎使用。我不确定你所说的“被叫”是指什么。你说的是正在执行的代码还是正在下载的脚本?看看这个。另外,请注意,不同的web浏览器之间实际上是不同的。在网络控制台中,在脚本“1.js”之前调用的内联脚本“3.js”——您是指下载js文件的顺序吗?