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(“”)代码>
3.js
,因为浏览器扫描浏览器中的资产并立即开始下载脚本。HTML解析器解析并执行相应的内联脚本标记后,它才能开始下载1.js
和2.js
这意味着HTML解析器在下载1.js
和2.js
时被阻止。如果您的所有脚本都像3.js
那样被直接包含,那么浏览器很可能会并行地预取这三个脚本,从而使页面加载更加高效
预取实现是特定于浏览器的,因此您可能会在其他浏览器中看到不同的结果。欢迎使用。我不确定你所说的“被叫”是指什么。你说的是正在执行的代码还是正在下载的脚本?看看这个。另外,请注意,不同的web浏览器之间实际上是不同的。在网络控制台中,在脚本“1.js”之前调用的内联脚本“3.js”——您是指下载js文件的顺序吗?