起因
可能是短时间内看多了事件循环的题目,而题目中的setTimeout很多都没有第二参数规定时间,例如
setTimeout(function(){
console.log(1);
})
Promise.resolve(2).then(res=>{
console.log(res);
})
setTimeout(function(){
console.log(4);
})
console.log(3);
//3,2,1,4
导致后续有第二参数的时候,会有一个错误想法出现,虽然前者延迟时间比后者的长,但是前者是比后者先加入宏任务执行队列的,所以前者应该比后者先执行,如果你很清楚事件循环的流程的话,那么你应该知道这个想法错误的点在哪
setTimeout(function(){
console.log(1);
}, 200)
Promise.resolve(2).then(res=>{
console.log(res);
})
setTimeout(function(){
console.log(4);
}, 100)
console.log(3);
//3,2,4,1
解释
其实就是对回调函数进入执行队列的时机有一个错误的认知,对于setTimeout来说,并不是一开始执行到其所在行就将它放进事件队列的,而是等第二参数延迟时间过了才将它的回调函数推进事件队列中去
setTimeout(function(){
console.log(1);
}, 100)
Promise.resolve(2).then(res=>{
console.log(res);
})
setTimeout(function(){
console.log(4);
}, 100)
console.log(3);
//3,2,1,4
setTimeout(function(){
console.log(1);
}, 200)
Promise.resolve(2).then(res=>{
console.log(res);
setTimeout(function(){
console.log(5);
}, 50)
})
setTimeout(function(){
console.log(4);
}, 100)
console.log(3);
//3,2,5,4,1
setTimeout(function(){
console.log(1);
}, 200)
Promise.resolve(2).then(res=>{
console.log(res);
setTimeout(function(){
console.log(5);
setTimeout(function(){
console.log(6);
}, 50)
}, 50)
})
setTimeout(function(){
console.log(4);//比6先被主程序遇到,时间相同先执行
}, 100)
console.log(3);
//3,2,5,4,6,1
setTimeout(function(){
console.log(1);
}, 200)
Promise.resolve(2).then(res=>{
console.log(res);
setTimeout(function(){
console.log(5);
setTimeout(function(){
console.log(6);
}, 50)
}, 50)
})
setTimeout(function(){
console.log(4);
}, 150)
console.log(3);
//3,2,5,6,4,1
而第二参数的时间如果相同,那么谁先被主程序检测到就先执行谁,还有一种情况是,如果是嵌套setTimeout,那么延迟的时间将会累加,平行对比累加的时间,并不在乎所在的位置
解释的比较乱,可能有错误,如果有发现再改吧