js面试必备:Eventloop

同步任务和异步任务

由于javascript是一门单线程导致后面的任务需要等到前面的任务完成才能执行,如果前面的任务很耗时就会造成后面的任务一直等待。为了解决这个问题,JavaScript 将主线程中的任务分为同步任务和异步任务。
同步任务:是在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。
异步任务:不进入主线程、通过事件循环机制处理,在任务队列中注册回调函数最终拿到结果。
异步任务又分为宏任务微任务
常见的宏任务有:
setTimeout,setInterval,DOM事件,ajax请求
常见的微任务:promise的then,async/await,(注意:promise是同步任务)

执行顺序:

1、同步任务>微任务>宏任务
2、每次执行完宏任务,又会重新查看有没有微任务。

console.log("script start");
 
setTimeout(function() {
  console.log("setTimeout---0");
}, 0);
 
setTimeout(function() {
  console.log("setTimeout---200");
  setTimeout(function() {
    console.log("inner-setTimeout---0");
  });
  Promise.resolve().then(function() {
    console.log("promise5");
  });
}, 200);
 
Promise.resolve()
  .then(function() {
    console.log("promise1");
  })
  .then(function() {
    console.log("promise2");
  });
Promise.resolve().then(function() {
  console.log("promise3");
}).then(function() {
  console.log("promise4");
});
console.log("script end");

1首先从上往下清理同步任务:
可以得到:script start script end
2是清理微任务:第一个then优先级更高:promise1 promise3
然后就是:promise2 promise4
3然后就是清理宏任务,又可以得到:setTimeout—0 setTimeout—200
4宏任务执行完后又有一个微任务和宏任务,先清理微任务可以得到:
promise5 inner-setTimeout—0
结果如下:

script start
 script end
 promise1
 promise3
 promise2
 promise4 
 setTimeout---0
 setTimeout---200
 promise5
 inner-setTimeout---0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值