Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript:异步加载的脚本,这些脚本是否经过评估;同时";(比赛条件)?_Javascript - Fatal编程技术网

JavaScript:异步加载的脚本,这些脚本是否经过评估;同时";(比赛条件)?

JavaScript:异步加载的脚本,这些脚本是否经过评估;同时";(比赛条件)?,javascript,Javascript,假设我使用异步脚本加载器异步(!!)加载多个JavaScript文件(该加载器将脚本标记写入文档头部,然后将下载文件),这些脚本是否并行计算 <script> var script = document.createElement('script'); script.src = "library1.js"; document.getElementsByTagName('head')[0].appendChild(script); </script> <!-

假设我使用异步脚本加载器异步(!!)加载多个JavaScript文件(该加载器将脚本标记写入文档头部,然后将下载文件),这些脚本是否并行计算

<script>
 var script = document.createElement('script');
 script.src = "library1.js";
 document.getElementsByTagName('head')[0].appendChild(script); 
</script>
 <!-- Other Markup -->
<script>
 var script = document.createElement('script');
 script.src = "library2.js";
 document.getElementsByTagName('head')[0].appendChild(script); 
</script>
<!-- Other Markup -->
<script>
 var script = document.createElement('script');
 script.src = "library3.js";
 document.getElementsByTagName('head')[0].appendChild(script); 
</script>

var script=document.createElement('script');
script.src=“library1.js”;
document.getElementsByTagName('head')[0].appendChild(脚本);
var script=document.createElement('script');
script.src=“library2.js”;
document.getElementsByTagName('head')[0].appendChild(脚本);
var script=document.createElement('script');
script.src=“library3.js”;
document.getElementsByTagName('head')[0].appendChild(脚本);
“正常”,当HTML文档中有标准脚本标记(body和head!?)时,浏览器将停止/完成所有其他活动(下载/页面呈现),并且只处理遇到的单个脚本标记。这将导致“序列化”执行,而不会导致任何“竞争条件”

但是通过使用异步加载程序技术,插入的脚本标记(在头部)是否也会(最终)导致(下载时)仅“当前”的序列化呈现脚本将被评估,或者其他异步加载的脚本文件是否有可能被并行评估,因此容易出现争用情况

非常感谢!!
Tim

尽管脚本将并行下载,但它们的执行顺序并不确定IE将按照下载完成的顺序执行,而Firefox则按照DOM中的连接顺序执行。

这是一个问题。例如,假设脚本A和脚本B是使用该技术添加的。现在假设脚本A是jQuery,脚本B执行以下操作:

$(document).ready(function(){...})
在IE中,无论出于何种原因(例如,网络流量、缓存未命中),脚本B在脚本A之前完成下载,您都会倒霉,因为它将在加载jQuery之前执行

请参阅以获得更好的解释


至于解决方案,您可以(例如在关闭
元素之前)。虽然这不能保证并行下载,但它确实有助于减轻“阻塞”您的解决方案正在解决问题。

如前所述,Javascript是由单个线程执行的。因此,您的脚本不可能并行执行。正如Crescent Fresh的回答所指出的,您不能依赖于执行它们的顺序,但您可以依赖于在下一个开始之前完全执行一个,只要脚本中没有任何内容执行设置超时或其他异步操作。

您好,fresh crescent:非常感谢您提供了这一出色且非常有用的答案!!!!@Tim:这是一个非常快速的回答,谢谢您。我只是想澄清一下,“阻塞”是指“UI阻塞”。可能只是一个简短的问题需要澄清,因为您没有明确提到这一点,但听起来是这样的:我是否正确地假设脚本总是按顺序执行,而不是并行执行?谢谢,我认为如果任何脚本依赖于另一个脚本,您应该在代码中强制执行它,即使用回调来运行依赖的sc当第一次完成后,请使用诸如RequireJs之类的工具来强制执行依赖关系…没有JQuery如何做到这一点?你好,aem,也非常感谢你,你的答案和链接的问题非常有帮助(搜索时我似乎错过了它)。非常感谢!!