JavaScript是多线程的吗?

And*_*rey 56 javascript jquery

这是我的问题 - 我需要使用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()  
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

gna*_*arf 81

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

  • 据我所知,动画是使用定时器,每个动画不是一个单一的过程,而是一些定时器事件的小增量变化序列,因此似乎多个动画同时发生 (12认同)
  • 动画更新由触发的计时器事件触发. (11认同)
  • 这可能是一个令人尴尬的简单问题,但如果JavaScript不是多线程的,为什么多个链式jQuery动画(例如)似乎同时发生而不是按顺序发生? (8认同)

Iva*_*uev 35

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

但目前并不是所有浏览器都支持它.

  • Web Workers是HTML5规范的一部分.http://www.whatwg.org/specs/web-workers/current-work/ (5认同)
  • 关于Workers的两点需要注意的是,他们无法访问DOM并且无法访问父页面. (5认同)

Jef*_*nal 16

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

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

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


Dan*_*ego 12

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


Han*_*sir 10

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

  • +1,虽然他们可以做其他事情,但是对于随之而来的破坏. (3认同)

buc*_*bay 6

需要明确的是,在浏览器JS实现不是多线程

语言,JS,可以多线程

然而,这个问题不适用于这里。

适用的是 getScript() 是异步的(立即返回并排队),但是,浏览器将按<script>顺序执行 DOM 附加内容,因此您的依赖 JS 代码将看到它们按顺序加载。这是浏览器功能,不依赖于 JS 线程或 getScript() 调用。

如果 getScript() 使用 xmlHTTPRequest、setTimeout()、websockets 或任何其他异步调用检索脚本,则不能保证您的脚本按顺序执行。但是,在所有脚本执行后,您的回调仍会被调用,因为“len”变量的执行上下文位于一个闭包中,该闭包通过对函数的异步调用来保持其上下文。