JavaScript是多线程的吗?

时间:2009-11-02 19:19:29

标签: 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()  
    })
  }
}

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

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

9 个答案:

答案 0 :(得分:79)

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

答案 1 :(得分:34)

目前JavaScript不是多线程的,但事情会在不久的将来发生变化。有new thing in HTML5名为Worker。它允许你在后台做一些工作。

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

答案 2 :(得分:16)

JavaScript (ECMAScript) specification没有定义任何线程或同步机制。

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

作为旁注,another commenter提到任何JavaScriptengine供应商都可以添加线程和同步功能,或供应商可以让用户自己实现这些功能,如本文所述:Multi-threaded JavaScript

答案 3 :(得分:12)

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

答案 4 :(得分:10)

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

答案 5 :(得分:2)

很明显,浏览器JS实现 不是多线程

语言,JS,可以是多线程

但问题不适用于此。

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

如果getScript()使用xmlHTTPRequest,setTimeout(),websockets或任何其他异步调用检索脚本,那么您的脚本将无法保证按顺序执行。但是,在所有脚本执行之后,仍会调用您的回调,因为您的&#39; len&#39;变量在一个闭包中,它通过函数的异步调用来持久化它的上下文。

答案 6 :(得分:1)

认为用“强制”,延迟脚本传递来尝试这个可能会很有趣......

  1. 添加了两个可用的脚本 谷歌
  2. 将delayjs.php添加为第2名 数组元素。 delayjs.php睡觉 在交付空的js之前持续5秒 对象。
  3. 添加了一个回调 “验证”是否存在 脚本中的预期对象 文件。
  4. 添加了一些js命令 在...之后的行上执行 GetScripts()调用“ test ”顺序js命令。
  5. 脚本加载的结果符合预期;只有在最后一个脚本加载后才会触发回调。让我感到惊讶的是,触发了GetScripts()调用之后的js命令,而无需等待最后一个脚本加载。我的印象是,当浏览器等待js脚本加载时,不会执行任何js命令...

    var scripts = [];
    scripts.push('http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js');
    scripts.push('http://localhost/delayjs.php');
    scripts.push('http://ajax.googleapis.com/ajax/libs/scriptaculous/1.8.3/scriptaculous.js');
    
    
    function logem() {
        console.log(typeof Prototype);
        console.log(typeof Scriptaculous);
        console.log(typeof delayedjs);
    }
    
    GetScripts( scripts, logem );
    
    console.log('Try to do something before GetScripts finishes.\n');
    $('#testdiv').text('test content');
    
    <?php
    
    sleep(5);
    echo 'var delayedjs = {};';
    

答案 7 :(得分:0)

如果你在HTML文档中创建了许多帧,并且在每个帧中运行一个脚本,你可能会得到某种多线程,每个脚本都在主框架中调用一个能够理解这些函数结果的函数。 。

答案 8 :(得分:0)

JS一般是单线程的。然而,HTML5 Web工作者引入了多线程。阅读更多http://www.html5rocks.com/en/tutorials/workers/basics/