JavaScript:异步加载的脚本,这些脚本是否经过评估;同时";(比赛条件)?
假设我使用异步脚本加载器异步(!!)加载多个JavaScript文件(该加载器将脚本标记写入文档头部,然后将下载文件),这些脚本是否并行计算JavaScript:异步加载的脚本,这些脚本是否经过评估;同时";(比赛条件)?,javascript,Javascript,假设我使用异步脚本加载器异步(!!)加载多个JavaScript文件(该加载器将脚本标记写入文档头部,然后将下载文件),这些脚本是否并行计算 <script> var script = document.createElement('script'); script.src = "library1.js"; document.getElementsByTagName('head')[0].appendChild(script); </script> <!-
<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,也非常感谢你,你的答案和链接的问题非常有帮助(搜索时我似乎错过了它)。非常感谢!!