下一个语句在前者结束之前运行

时间:2011-12-11 16:17:11

标签: javascript

我在我的Firefox上运行这些代码,console获取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的一个功能,在分配变量后我是否必须仔细检查变量? Cuz'太复杂了。

var a;
while(a!==get('some')){
    a=get('some');
    if(a===get('some')){
       whatShouldBeRun();afterGetSome();
       break;
    }
}

2 个答案:

答案 0 :(得分:3)

这正是你要求它做的。首先,你要求它启动两个声明以便在将来运行某些点。然后你写“3”。那些运行时间的第一个语句然后运行,并写入“2”。最后,第三次运行并写入“1”。

如果您正在使用异步处理 - settimeout - 那么您需要像处理任何其他语言一样处理此问题。但是如果你需要它按顺序运行,不要告诉它以异步方式运行。

让他们一个接一个地跑:

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

test();

[我可能有一些错误]

答案 1 :(得分:1)

上面的代码启动了两个timers,它将在500和1000毫秒后触发。 console.log(3);将首先运行,没有延迟;在500毫秒之后,将执行console.log(2),并在另外500毫秒之后执行console.log(1)。这是定时器如何在包含定时器的任何语言/框架中工作的一般方法。

顺序代码按顺序运行,即后续代码行按顺序执行。基于事件的系统(如Web浏览器及其JavaScript实现)的不同之处在于事件处理程序仅在事件发生时执行。代码test(); console.log(3);按顺序执行:通过使用给定的时间间隔和事件处理程序调用{​​{1}}启动两个计时器,并将setTimeout写入控制台。第一个计时器的“tick”事件发生在500 ms之后,其事件处理函数将3写入控制台。第二个“tick”事件发生在另一个500 ms之后,并将写入2