javaScript 的事件循环,微任队列,调用栈,消息队列

javaScript 的事件循环,微任队列,调用栈,消息队列

callbackasync 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至此整个函数调用完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值