1

在以下代码中:

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
4

3 回答 3

5

假设您打算打电话给doStuffBin doStuffA,并打电话给doStuffA某处......

Javascript 传统上是同步执行的。

所以:

1. DO SOME THINGS
2. DO B THINGS
3. DO SOME MORE THINGS
于 2013-01-24T21:03:41.597 回答
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 上的可运​​行版本: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)will run beforeb()确实如此。

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 Aconsole.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() do实际上是中断控制流。如果您的代码如下所示:

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 A无论您等待多长时间单击“确定”。confirm并且alert是 JavaScript 在等待某些外部源时暂停执行的唯一情况(如果我错了,请纠正我)。

于 2013-01-24T21:58:24.230 回答
-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

IE

    function doStuffA() {
     // DO SOME THINGS

       setTimeout(doStuffB,1);

     // DO SOME MORE THINGS
    }
    function doStuffB() {
    // DO B THINGS
    }
于 2013-01-24T21:09:48.037 回答