实验证明,setTimeout任务永远在普通任务后面执行,当执行一个较为久的任务时可以将其放入到setTimeout()中,让其延后执行
function a(){
setTimeout(function(){
alert("定时器任务");
},0);
sleep(5000);
alert("普通任务");
}
a();
function sleep(ms) {
var start = new Date();
while (new Date() - start <= ms) {}
}
下面更加助于理解的一个例子:
function a(){
setTimeout(function(){
console.log("定时器任务2"+ new Date());
},10000);
setTimeout(function(){
console.log("定时器任务1"+ new Date());
},5000);
console.log("start "+ new Date());
sleep(5000);
console.log("普通任务"+ new Date());
}
a();
function sleep(ms) {
var start = new Date();
while (new Date() - start <= ms) {}
}
结果如下:
换一下顺序:
function a(){
setTimeout(function(){
console.log("定时器任务1"+ new Date());
},5000);
console.log("start "+ new Date());
sleep(5000);
console.log("普通任务"+ new Date());
setTimeout(function(){
console.log("定时器任务2"+ new Date());
},10000);
}
a();
function sleep(ms) {
var start = new Date();
while (new Date() - start <= ms) {}
}
结果为:
这就好理解了,程序还是按顺序执行的,只不过遇到setTimeout时,等待设定的时间后,看队列中有没有在执行的任务,如果没有,则加入队列,并执行,如果有,则等待队列中的任务执行完了在加入执行。