Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是多线程的吗?_Javascript_Jquery - Fatal编程技术网

JavaScript是多线程的吗?

JavaScript是多线程的吗?,javascript,jquery,Javascript,Jquery,这是我的问题-我需要使用jQuery.getScript()动态下载几个脚本,并在加载所有脚本后执行某些代码,因此我的计划是这样做: function GetScripts(scripts, callback) { var len = scripts.length for (var i in scripts) { jQuery.getScript(scripts[i], function() { len --; // executing ca

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

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)并执行回调方法的情况


所以我的问题是——这个假设正确吗?如果不正确,那么实现我的目标的方法是什么?

不,JavaScript不是多线程的。它是事件驱动的,您对事件按顺序触发(假设它们按顺序加载)的假设就是您将看到的。您当前的实现看起来是正确的。我相信jQuery的
.getScript()
注入了一个新的
标记,这也会迫使它们以正确的顺序加载。

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

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


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

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

未定义任何线程或同步机制

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


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

认为尝试“强制”延迟脚本交付可能会很有趣

  • 从中添加了两个可用脚本 谷歌
  • 添加delayjs.php作为第二个 数组元素。delayjs.php睡眠 在发送空js之前等待5秒 反对
  • 添加了一个回调 “验证”是否存在 脚本中的预期对象 档案
  • 添加了几个js命令 在 GetScripts()调用,以“测试”连续的js命令
  • 脚本加载的结果与预期一致;只有在加载最后一个脚本后才会触发回调。令我惊讶的是,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 = {};';
    
    var脚本=[];
    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');
    函数logem(){
    控制台日志(原型类型);
    console.log(脚本类型);
    console.log(类型为delayedjs);
    }
    获取脚本(脚本、日志);
    log('在GetScripts完成之前尝试执行某些操作。\n');
    $('#testdiv').text('testcontent');
    
    如果在HTML文档中创建多个框架,并在每个框架中运行一个脚本,每个脚本调用主框架中的一个函数,该函数应该能够理解这些函数的结果,那么您可能会获得某种多线程性

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

    语言JS,可以是多线程的

    然而,这个问题在这里并不适用

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


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

    JS通常是单线程的。然而,HTML5Web工作者引入了多线程。更多信息请阅读

    javascript是多线程的,这里有一个链接可以查看以显示一个示例:@aforloney-这不完全正确。正如Sun工程师在文章中引用的那样,Rhino JavaScript引擎“允许Java方法调用。因此,我们可以使用它为Java平台类创建脚本包装器……我们可以轻松地在脚本中创建线程。”非常适合在所有脚本之后执行代码,并行或顺序运行,基本上我不在乎加载的顺序,我只需要确保我的回调函数只会在所有脚本加载时执行,因为它取决于所有脚本。这可能是一个令人尴尬的简单问题,但如果JavaScript不是多线程的,为什么多个链接的jQuery动画(例如)看起来是同时发生的,而不是按顺序发生的?动画更新是由触发的计时器事件触发的。据我所知,动画使用计时器,并且每个动画不是单个进程,而是某个计时器事件上的一系列小增量更改,因此,多个动画似乎同时发生。在Javascript实现中,Worker是一个新事物,但我不知道如何实现