【js】事件循环evenloop
先上题目
console.log(1) setTimeout(()=>{ console.log(2) },0) console.log(3)
答案:1 3 2
console.log(1) setTimeout(()=>{ console.log(2) },0) new Promise(resolve=>{ console.log(3) resolve() }).then(()=>{ console.log(4) }) console.log(5)
答案 : 1 3 5 4 2
console.log(1) setTimeout(()=>{ console.log(2) },0) new Promise(resolve=>{ console.log(3) resolve() }).then(()=>{ console.log(4) setTimeout(()=>{ console.log(5) },0) }) console.log(6)
答案: 1 3 6 4 2 5
console.log(1) function a(){ console.log(2) b() } function b(){ setTimeout(()=>{ console.log(3) },0) console.log(4) } a() new Promise(resolve=>{ console.log(5) resolve() }).then(()=>{ console.log(6) setTimeout(()=>{ console.log(7) },0) }) console.log(8)
答案: 1 2 4 5 8 6 3 7
t同步>异步(微任务>宏任务)
执行顺序 同步 1 ->a()执行 输出 2 -> 调用b() setimeout 属于异步任务里面的宏任务,放到任务队列里面,等待同步任务在主线程执行完毕,再执行异步任务队列中的事件。输出4 ->promise是一个异步,但是new promise是创造一个构造函数,第一层是同步任务 ;第二层.then() .cath()是异步。输出 5 .then()属于异步任务里面的微任务,放到任务队列---> 输出 8 --->主线程的同步任务已经出栈执行完毕,开始检查任务队列里面的事件。异步的任务队列里面,微任务的优先级高于宏任务,先微后宏。所以.then()会先执行,输出6,接着往下是settimeout,会继续放到任务队列宏任务。--->微任务出栈完毕,开始检查宏任务,settimeout时间一致,先后顺序执行,依次输出 3 7 。这一整个事件的过程就叫事件循环机制。