Javascript 下一条语句在前一条语句结束之前运行

Javascript 下一条语句在前一条语句结束之前运行,javascript,Javascript,我在firefox上运行这些代码,控制台得到3 2 1,这意味着语句在前一个语句结束之前运行 function test(){ setTimeout(function(){console.log(1)},1000); //statement 0 setTimeout(function(){console.log(2)},500); //statement 1 } test(); console.log(3);

我在firefox上运行这些代码,
控制台
得到
3 2 1
,这意味着语句在前一个语句结束之前运行

function test(){
    setTimeout(function(){console.log(1)},1000);    //statement 0
    setTimeout(function(){console.log(2)},500);     //statement 1
}
test();
console.log(3);                                     //statement 2
这是javascript的一个特性吗?在给变量赋值后,我是否必须对其进行双重检查?因为这太复杂了

var a;
while(a!==get('some')){
    a=get('some');
    if(a===get('some')){
       whatShouldBeRun();afterGetSome();
       break;
    }
}
上述代码启动两个,分别在500和1000毫秒后触发<代码>控制台日志(3)将首先运行,没有延迟;500毫秒后,将执行
console.log(2)
,再过500毫秒,将执行
console.log(1)
。这是计时器在任何包含计时器的语言/框架中工作的一般方式


顺序代码是按顺序运行的,也就是说,后续的代码行是按顺序执行的。基于事件的系统(如web浏览器及其JavaScript实现)的不同之处在于,事件处理程序仅在事件发生时执行。代码
test();控制台日志(3)按顺序执行:通过调用具有给定间隔和事件处理程序的
setTimeout
启动两个计时器,并将
3
写入控制台。第一个计时器的“滴答”事件在500毫秒后出现,其事件处理程序函数将
2
写入控制台。第二个事件的“tick”事件在另一个500毫秒之后出现,并将写入
1

,这正是您要求它执行的操作。首先,您要求它开始两个语句,以便在将来的某个时候运行。然后你写“3”。要运行的第一个语句将运行,并写入“2”。最后,第三个运行并写入“1”

如果您使用的是异步处理settimeout,那么您需要像处理任何其他语言一样处理它。但是,如果您需要它按顺序运行,不要告诉它异步运行

要让它们一个接一个地运行:

function test()
{
    setTimeout(function()
    {
        console.log(1);setTimeout(function()
           {
                  console.log(2);console.log(3)
           },500)
    },1000);
}

test();

[我可能有一些错误]

我使用
setTimeout()
来刺激一个需要很长时间的函数,比如网络或sql查询。我怎样才能知道一个函数是否异步运行,比如一个添加大量数字或处理大量文本的函数?超时显式地异步运行。ajax调用也是如此。这在很大程度上取决于你打什么电话。如果它们确实运行异步,那么您必须修改您的处理以处理此问题。请参阅对我答案的编辑。谢谢,我至少有一个线索:)