JavaScript 是多线程的吗?

IT技术 javascript jquery
2021-02-03 18:47:40

这是我的问题 - 我需要使用 jQuery.getScript() 动态下载多个脚本并在加载所有脚本后执行某些JavaScript代码,所以我的计划是做这样的事情:

function GetScripts(scripts, callback)
{
  var len = scripts.length
  for (var i in scripts)
  {
    jQuery.getScript(scripts[i], function() 
    {
      len --;
      // executing callback function if this is the last script that loaded
      if (len == 0)
        callback()  
    })
  }
}

只有当我们假设每个脚本的 script.onload 事件触发并顺序和同步执行时,这才会可靠地工作,因此永远不会出现两个或多个事件处理程序通过检查 (len == 0) 并执行的情况回调方法。

所以我的问题 - 这个假设是否正确,如果不正确,实现我想要做的事情的方法是什么?

6个回答

不,JavaScript 不是多线程的。它是事件驱动的,您将看到的事件是按顺序触发的(假设它们按顺序加载)。您当前的实现看起来是正确的。我相信 jQuery.getScript()注入了一个新<script>标签,这也应该强制它们以正确的顺序加载。

我基本上不关心加载的顺序,我只需要确保我的回调函数只会在所有脚本都加载时执行,因为它依赖于所有脚本。
2021-04-01 18:47:40
据我了解,动画使用定时器,每个动画不是一个单一的过程,而是一些定时器事件的一系列小增量变化,因此似乎多个动画同时发生
2021-04-05 18:47:40
动画更新由触发的计时器事件触发。
2021-04-06 18:47:40
这可能是一个令人尴尬的头脑简单的问题,但如果 JavaScript 不是多线程的,为什么多个链接的 jQuery 动画(例如)看起来是同时发生而不是依次发生?
2021-04-13 18:47:40

目前 JavaScript 不是多线程的,但在不久的将来情况会发生变化。HTML5 中有一个新东西叫做Worker它允许你在后台做一些工作。

但目前并非所有浏览器都支持它。

关于 Workers 需要注意的两件事是他们无法访问 DOM 并且无法访问父页面。
2021-03-24 18:47:40
Web Workers 是 HTML5 规范的一部分。whatwg.org/specs/web-workers/current-work
2021-04-01 18:47:40
Worker 是 Javascript 实现中的新事物,但我看不出它与 HTML 5 有什么关系
2021-04-03 18:47:40
现在所有新浏览器都支持工作人员(IE 10 是最后一个加入的)w3schools.com/html/html5_webworkers.asp
2021-04-04 18:47:40
哦...是的,我的坏...不知道我从哪里得到它
2021-04-13 18:47:40

所述的JavaScript(ECMAScript的)规范没有定义任何线程或同步机制。

此外,我们浏览器中的 JavaScript 引擎特意是单线程的,部分原因是允许多个 UI 线程同时运行会打开一个巨大的蠕虫罐。所以你的假设和实现是正确的。

作为旁注,另一位评论者提到这样一个事实,即任何 JavaScript 引擎供应商都可以添加线程和同步功能,或者供应商可以让用户自己实现这些功能,如本文所述:多线程 JavaScript

我总是对符合规范的答案印象深刻。附:(真诚的,不是讽刺)
2021-04-06 18:47:40

JavaScript 绝对不是多线程的 - 您可以保证您使用的任何处理程序都不会被另一个事件中断。任何其他事件,如鼠标点击、XMLHttpRequest 返回和计时器将在您的代码执行时排队,并一个接一个地运行。

不,所有浏览器都只为您提供一个 JavaScript 线程。

+1,虽然他们可以做其他事情,但对于随之而来的破坏。
2021-03-22 18:47:40