JavaScript是多线程的吗?
这是我的问题-我需要使用jQuery.getScript()动态下载几个脚本,并在加载所有脚本后执行某些代码,因此我的计划是这样做: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
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供应商都可以添加线程和同步功能,或者供应商可以让用户自己实现这些功能,如本文所述:?认为尝试“强制”延迟脚本交付可能会很有趣
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是一个新事物,但我不知道如何实现