关于您的语法有很多讨论,但我认为我可以很好地填补空白以理解您的要求。您想知道 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 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()
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 在等待某些外部源时暂停执行的唯一情况(如果我错了,请纠正我)。