在以下代码中:
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
答案 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 A
。 confirm
和alert
是唯一的情况(如果我错了,请纠正我),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
}