【问题标题】:Browser Javascript engines always single-threaded? [duplicate]浏览器 Javascript 引擎总是单线程的? [复制]
【发布时间】:2013-02-04 20:23:54
【问题描述】:

我有一个包含 2 个 Javascript 文件的网页。第二个文件需要它之前的文件。更具体地说,在我的第二个 Javascript 文件中,我立即使用了 jQuery 的 .ajax() 方法。是否有可能在非常极端的情况下,当我去使用 jQuery 时它可能还没有准备好?

注意:我不想使用 $(document).ready() 也不想使用诸如 require.js 或 head.js 之类的库。我只是想确信当我去使用 jQuery 时它会在那里,并且即使在边缘情况下也会尊重 Javascript 的单线程特性。

【问题讨论】:

  • 只要你不使用AJAX,脚本就会按照遇到的顺序同步执行。 (即便如此,readystatechange 与任何其他事件在同一线程上调度。)尽管有 asyncdefer 等属性。
  • $(document).ready() 是 jQuery 的一部分,如果你可以使用它,你可以在 jQuery 中使用其他任何东西。

标签: javascript html browser


【解决方案1】:

请阅读:http://api.jquery.com/category/events/document-loading/,您实际上是在设置代码何时在页面开头运行。如果您想使用 $(document).ready() 并不重要,它是必需的,尽管我们大多数人都将其视为:

$(function() {};

我不确定您的担忧是否有效,您还没有真正指定一个您无法通过测试应用程序自行解决的问题,但如果您遇到 jscript,您可能想要做什么在多 js 文件环境中执行之前的代码(同样,为什么不只使用 1,尤其是如果您不熟悉技术细节)是:How to load one JavaScript file from another? load jscript from your jscript shrug

$.getScript("another_script.js");

【讨论】:

  • 我知道。这是一个非常开放的问题,因为我无法在 IE 5.5 之后的所有浏览器上测试这个理论。一位同事提出来了,我在网上找不到任何证据。
【解决方案2】:

<script> 包含的带有src 属性的脚本是串行加载的。因此,如果您有设置

<script src="one-file"></script>
<script src="other-file"></script>

...one-file 必须在文档可以继续解析之前完成下载和执行(即在开始检索其他文件之前)。这与 deferasync 属性不同,但您可能会忽略这些属性。

如果我的回答对你来说不够安心,I gleaned it from the HTML spec itself

【讨论】:

    【解决方案3】:

    如果您在需要使用$.ajax() 方法的文件之前引用了 jQuery,那么您可以确信 jQuery 将可供使用。

    需要明确的是,$(document).ready() 并不确保 jQuery 已准备就绪,而是确保 DOM 已准备好进行操作。

    【讨论】:

      【解决方案4】:

      是的,Javascript 是严格的单线程的,每个脚本都会在下一个脚本被解析之前被解析。

      第二个脚本在第一个脚本没有先运行的情况下运行的唯一情况是,如果请求第一个脚本失败,但请求第二个脚本成功,但如果脚本无法加载,那么无论如何你都会搞砸了。

      【讨论】:

        猜你喜欢
        • 2013-08-22
        • 1970-01-01
        • 2014-02-27
        • 1970-01-01
        • 2014-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多