js 异步执行_一段JavaScript代码是如何执行的

js事件循环

当我们执行一行js代码时,如果是同步任务,就把它直接放到执行栈里面去执行,如果是异步任务,会把它放到一个异步的任务队列中,等待同步任务执行完,然后再从异步任务中读取异步任务.

异步任务

异步任务又分为 “宏任务” 和 “微任务”.

宏任务是宿主环境提供的. 例如setTimeout()以及正常的js脚本.

微任务是由语言标准提供的. 像平时用的 promise,nextTick

异步任务队列

异步任务队列里又有 “宏任务队列” 和 “微任务队列” ,如果同步任务执行完了,然后会先去执行微任务,会把所有的微任务执行完,才会去执行新的一轮宏任务.

测试代码

// 同步任务console.log("script start");// 异步任务 --- 宏任务setTimeout(() => {  console.log("setTimeout1");}, 0);// 异步任务 --- 微任务 (如果是 new Promise()则是同步任务, 切记)Promise.resolve()  .then(function () {    console.log("promise1");  })  .then(function () {    console.log("promise2");  });// 异步任务---宏任务setTimeout(() => {  console.log("setTimeout2");}, 0);// 同步任务console.log("script end");

结果调试

执行console.log("script start"); 因为它是同步代码所以立即打印 script start

f04dce3f26bf55efd57ef7db87436c40.png

执行到setTimeout()时,因为它不是一个同步任务,所以会先将它放到异步任务队列中,等待同步任务执行结束才会执行.

cbef49d8b88a302a44678c237a7b0cfe.png
cda8d41b47bd58292ed4285a564d5de9.png

执行到console.log("script end");时,因为是同步任务,所以立即输出 “script end”

85d155beef77787c5afd1ebaaae59561.png

现在同步任务已经处理完成, 接着就是处理异步任务. 因为 “宏任务” 执行顺序优先于 “微任务”, 所以会先去执行 Promise

626e1a7e8817cb871835b8a030cb8c5c.png

异步队列宏任务处理完, 接着 去处理异步队列的 “微任务”

f813da8a2aa6436eb5c59e8c7e929eb7.png
c6e5ea7d6c0a4b3cd263c471e8fc6c87.png

执行结果

script startscript endpromise1promise2setTimeout1setTimeout2
fa2426da8d74e5e1649c2228dd204004.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值