首页 > 代码库 > 函数中setTimeout的执行顺序
函数中setTimeout的执行顺序
这里先给出一段代码:
function a(){
setTimeout(function(){
console.log("setTimeout")
},2000);
function oneSecond(){
var now = new Date();
var exitTime = now.getTime() + 1000;
while (true) {
now = new Date();
if (now.getTime() >= exitTime){
console.log("oneSecond")
return;
}
}
}
oneSecond();
function twoSecond(){
var now = new Date();
var exitTime = now.getTime() + 2000;
while (true) {
now = new Date();
if (now.getTime() >= exitTime){
console.log("twoSecond")
return;
}
}
}
twoSecond();
function threeSecond(){
var now = new Date();
var exitTime = now.getTime() + 3000;
while (true) {
now = new Date();
if (now.getTime() >= exitTime){
console.log("threeSecond")
return;
}
}
}
threeSecond();
}
a();
代码解释:调用函数a,首先执行setTimeout-两秒后执行,函数onesecond执行一秒,函数twosecond执行两秒,函数threesecond执行三秒。
请问控制台输出的顺序是什么???
这是一道面试题,当时我回答的输出顺序是onesecond---twosecond---settimeout---threesecond
我的根据是:js引擎是单线程的,执行函数a,settimeout进入执行队列,两秒后执行,这是onesecond,twosecond,threesecond进入js线程执行队列中,onesecond执行完后还没有轮到settimeout,但twosecond需要执行两秒,所以等待twosecond执行完后,settimeout才能开始执行,执行完后才执行。
但在浏览器中输出的结果却不是这样的,顺序为onesecond---twosecondt---threesecond---settimeout。
这是一个意外的结果,所以我给出了我新的理解,就是一个执行环境中,settimeout是有一个计时线程控制的,它会把这个计时器加到执行环境中最后一个执行。所以这个输出结果就理所当然了。