在另一个函数中调用javascript函数时,是否同步执行?

时间:2013-01-24 21:00:51

标签: javascript

在以下代码中:

function doStuffA() {
 // DO SOME THINGS

 doStuffB();

 // DO SOME MORE THINGS
}
function doStuffB() {
// DO B THINGS
}
doStuffA();

代码的执行顺序是什么?

是吗:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

或者:

1. DO SOME THINGS
2. DO B THINGS & DO SOME MORE THINGS - AT THE SAME TIME

3 个答案:

答案 0 :(得分:5)

假设您打算在doStuffB打电话给doStuffA,并在某个地方打电话给doStuffA ......

Javascript传统上是同步执行的。

因此:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

答案 1 :(得分:2)

关于你的语法有很多讨论,但我认为我可以很好地填补空白,以了解你的要求。您想知道JavaScript是否按顺序执行;具体来说,如果函数调用将暂停执行调用函数,直到被调用函数终止。

一般情况

对于一般情况,答案是肯定的。以下是一些示例代码来说明这一点:

var count = 0;
var result = "";

function a() {
    result += "first part of A. \n";    
    b();    
    result += "last part of A. ";
}

function b() {
    for (var i = 0; i < 100000; i++) {
        count++;
    }
    result += "even after " + count + " cycles, A waits for B. \n";
}

a();
console.log(result);

jsFiddle上的Runnable版本:http://jsfiddle.net/jmorgan123/574Rh/

试一试。你会看到结果是:

first part of A. 
even after 100000 cycles, A waits for B. 
last part of A.

规则的例外情况

这有例外,它们非常重要。设置间隔或超时时,程序启动计时器并计划在计时器完成时运行一个函数。但它不会等待这种情况发生;一旦计时器启动,程序的其余部分继续执行其他任务:

//won't do what you want:
result += "first part of A ";  
setInterval(b, 1000);
result += "last part of A ";

在这种情况下,a()运行完毕后,result将为:

first part of A, last part of A 

事实上,这就是你所看到的,因为console.log(result)会在b()之前运行。

JS推迟执行的另一个重要案例是AJAX调用;这让人们一直在吵闹。以下是这个错误的一个例子:

//also won't do what you want:
result += "first part of A ";
$.get('ajax/test.html', function(data) {
    result += "now with AJAX! "; 
});
result += "last part of A ";

同样,first part of A, last part of A运行时结果为console.log(result)。保证代码在 AJAX调用之后运行的唯一方法是将其放入回调中:

var result = "";

function a() {
    result += "first part of A ";
    $.get('ajax/test.html', function(data) {
        result += "now with AJAX! "; 
        result += "last part of A ";
        console.log(result);
    });
}

a();

alert()confirm()

最后一点说明:有趣的是,函数alert()confirm() 执行,实际上是中断控制流程。如果您的代码如下所示:

result += "first part of A, ";  
result += confirm("what is your choice?"); //let's assume you click 'OK' here
result += ", last part of A";

...无论您等待多长时间,单击“确定”,结果都为first part of A, true, last part of Aconfirmalert是唯一的情况(如果我错了,请纠正我),JavaScript会在等待外部源时暂停执行。

答案 2 :(得分:-1)

好的,假设您要拨打doStuffA() ...

    function doStuffA() {
     // DO SOME THINGS

     doStuffB();

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }

以上将导致

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS

如果您想要异步方法,可以使用setTimeout()。以下是一些文档:https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout

    function doStuffA() {
     // DO SOME THINGS

       setTimeout(doStuffB,1);

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }