js 是单线程执行的
js中的任务按顺序一个一个的执行,但是一个任务耗时太长,那么后面的任务就需要等待,为了解决这种情况,将任务分为了同步任务和异步任务,而异步任务又可以分为微任务和宏任务
- 调用栈(call stack): js执行代码的区域,遵循先进后出
- 任务队列(先进先出):
- 宏任务队列(任务优先级低):放在里面的有:script整体代码、setTimeout、setINterval、I/O、...
- 微任务队列(任务优先级高):目前我所知道的放在微任务队列里的有:Promise.then()、...
- WEB API(提供异步机制,将要执行的代码分配给任务队列,延时任务在时间结束后才能分配)
事件轮询机制流程
- 调用栈先执行一遍js整体代码,执行过程中,同步代码直接执行,异步代码交给WEB API分配,出栈
- 调用栈执行完毕后,WEB API分配任务,将宏任务交给宏任务队列,微任务放在微任务队列
- 事件轮询首先询问微队列:如果有就清空执行完微队列,然后执行宏队列,再web api 分配,再执行微队列 ,循环往复
例题
console.log(1)
setTimeout(() => {
console.log(2)
}, 0)
new Promise(resolve => {
console.log(3)
resolve()
}).then(() => {
console.log(4)
})
setTimeout(() => {
console.log(5)
new Promise(resolve => {
console.log(6)
setTimeout(() => {
console.log(7)
})
resolve()
}).then(() => {
console.log(8)
})
}, 500)
new Promise(resolve => {
console.log(9)
resolve()
}).then(() => {
console.log(10)
setTimeout(() => {
console.log(11)
}, 0)
})
console.log(12)
根据上面方法,判断这段代码的输出? 结果在最后 *
上面这段代码的输出结果是
1 3 9 12 4 10 2 11 5 6 8 7
你算对了吗