javaScript 的事件循环,微任队列,调用栈,消息队列
callback
和async await
以及像console.log;let a=0;这样的代码
的执行区别?
首先了解下什么是调用栈 微任务队列 消息队列
调用栈
如其名是先进后出并且在函数的调用执行是在其中执行的
微任务队列
如其名是先进先出并且其实也就是回调函数的暂存处(排队处)
消息队列
如其名是先进先出并且其实也就是异步async以及Promise的then
函数的暂存处(排队处)
其实已经很明确了。
let a=async()=>{
console.log("a")
b()
c()
}
let b=async()=>{
setTimeout(()=>{
console.log("b")
},0)
}
let c=async()=>{
new Promise((reslove,reject)=>{
reslove()
}).then(()=>{console.log("c")})
}
a()
以上代码执行顺序是:a()
被压入调用栈,进入a函数体内
,console.log("a")
被压入调用栈,立即执行,输出a
,console.log("a")
出栈.b()
被压入调用栈,进入b函数体内
,将setTimeout()
压入调用栈,将setTimeout()的回调函数入队到消息队列
,消息队列和微任务队列都会在调用栈清空后执行,微任务队列的执行顺序优先于消息队列。
后面setTimeout()
出栈,在后面就是c()
被压入调用栈,进入c函数体内
,将new Promise((reslove,reject)=>{ reslove() })
执行完毕后出栈,将.then(()=>{console.log("c")}) }
如队到微任务队列,最后a()
出栈,然后执行.then(()=>{console.log("c")})打印出c出栈,然后执行setTimeout()的回调函数打印出b
至此整个函数调用完成。