HTML </script>中多个<script>标记的含义

时间:2011-01-11 15:41:05

标签: javascript jquery html

我已经读过,不建议在HTML中多次实例化jQuery。这对我来说很有意义,但是: 反正不是Javascript单线程吗?并且让jQuery落后,浏览器如何执行这些多个脚本标记?并行或一个接一个?

谢谢,菲利普

5 个答案:

答案 0 :(得分:36)

简单回答:

在一个简单的场景中(标签是原始HTML文本的一部分),浏览器肯定会一个接一个地执行它们。

详细讨论不同警告

JavaScript不一定是单线程的(它取决于JavaScript引擎的实现,例如,请参阅Web Workers)。

但是,各个<script>标签是按顺序执行的。

供参考,请参阅JavaScript: The Definitive Guide。引用“12.3。执行JavaScript程序”一章:

  

出现在和标签之间的JavaScript语句按照出现的顺序执行;当文件中出现多个脚本时,脚本将按照它们出现的顺序执行。如果脚本调用document.write(),则传递给该方法的任何文本都会在结束标记之后立即插入到文档中,并在脚本完成运行时由HTML解析器进行解析。相同的规则适用于具有src属性的单独文件中包含的脚本。


请注意,以上仅适用于标签中“直接”执行代码。但是,订单可能受以下因素影响:

  • setTimeout()来电(duh)

  • defer attribute

  • <script>标签的动态附件 - 请参阅此答案的最后一部分。


作为警告,请注意,通过<script src="xxxx" />从外部加载的JavaScript代码仍会按顺序执行,但是,很可能浏览器 DOWNLOAD 并行代码 - 取决于浏览器实现(但仍按正确顺序安排下载代码片段的执行)。

这个警告很重要,如果你想要一些奇怪的黑客,而JavaScript源的URL实际上是一个CGI脚本,它做了一些事情,你试图依赖于脚本中逻辑的正确下载顺序。

同样,它与你的浏览器JS引擎的那些脚本片段的执行顺序无关。


然而,更强烈的重要警告是,如果您实际上将<script>标记动态附加到外部来源(例如通过appendChild()调用),则根据{{3 }},以及this SO post,非IE浏览器不保证执行顺序!这将取决于首先下载哪个标签的代码!

答案 1 :(得分:4)

您实例化jQuery对象的调用越少,开销越少 - 但即使您正在为第二代硬件上运行的旧浏览器进行设计,也要小心微优化。分析您的应用程序并修复实际的瓶颈。

至于浏览器处理多个脚本标记的方式 - 它随浏览器的不同而不同,从版本到版本,有时甚至从操作系统到操作系统。所有浏览器都按文档顺序执行每个脚本标记:

<script src="scripts/some_script.js"></script> <!-- Executed 1st -->
<script src="scripts/some_other_script.js"></script> <!-- Executed 2nd -->
<script>
// Some JavaScript
</script> <!-- Executed 3rd -->
<script>
// Some More JavaScript
</script> <!-- Executed 4th -->

但是,其他行为未定义且存在差异。例如,Opera(至少在Windows XP上版本10.6)在其自己的上下文中运行每个脚本标记 - 因此,如果在第4个脚本块中引用,则第3个脚本块中的局部变量将超出范围。

<script>
var i = 42;
</script>
<script>
alert(i);
// Alerts "undefined" in Opera, but 42 in Firefox.
</script>

答案 2 :(得分:2)

浏览器按顺序执行JavaScript(jQuery也是如此,因为jQuery只是JavaScript)。

至于在HTML中有多个脚本标签,没有理由认为这是一个问题。正如Nabab所问,我很想看到你的来源。

答案 3 :(得分:0)

浏览器在处理过程中是否无法将所有javascript编译成一个“文件”。例如,如果您在多个文件中有多个$(document).ready()调用,那么当浏览器预处理页面时,它基本上会压缩所有内容以执行 - 并按照“看到”的顺序依次运行它。

答案 4 :(得分:-3)

是的,我们可以在标签内写入任意数量的标签。浏览器会按顺序访问它们。

 <html>
   <body>

    <!-- here your code-->

      <script></script>
      <script></script>
      <script></script>
              .
              .
              .
      <script></script>

    </body>
</html>