setTimeout与console.log之间执行先后顺序
setTimeout延时为0时:
o2o:
setTimeout(function(){
console.log(2);
},0);
console.log(1);
//输出顺序:1,2
n2n:
setTimeout(function(){
console.log(4);
},0);
setTimeout(function(){
console.log(5);
},0);
console.log(1);
console.log(2);
console.log(3);
//输出顺序:1,2,3,4,5
……
原因:页面中所有由setTimeout定义的操作,都将放在同一个队列中依次执行。而这个队列的执行时间需要等到函数调用栈执行完毕后才会执行,也就是等待所有的可执行代码执行完毕,才会轮到setTimeout执行其内部操作,并且按照其时延时间长短顺序执行代码!
例题:
setTimeout(function(){
console.log(a);
},0);
var a = 1;
console.log(b);
var b = 2;
var c = 3;
var d = 4;
var e = 5;
function fx(c){
console.log(c);
}
function fn(e,d){
console.log(d);
setTimeout(function(){
console.log(e);
},10);
}
setTimeout(function(){
console.log(b);
},20);
fn(e,d);
fx(c);
依次输出:
undefined
4
3
1
5
2
原因:
1、console.log()函数会在setTimeout函数之前执行,并且b在输出之前未被定义所以最先输出undefined;
2、之后,会执行fn函数和fx函数,而fn函数内存在console.log函数,那么它将会先输出d的值4;
3、然后,在fx函数内也存在console.log函数,同样会先输出c的值3;
4、再来比较setTimeout函数时延长短,依次输出1,5,2。