zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js--事件循环

2023-09-27 14:26:50 时间

  • 微信扫码关注公众号 :前端前端大前端,追求更精致的阅读体验 ,一起来学习啊
  • 关注后发送关键资料,免费获取一整套前端系统学习资料和老男孩python系列课程
    在这里插入图片描述

学习资源推荐

  • 学习资源推荐 https://blog.csdn.net/qq_42813491/article/details/90213353

理解

1.所有同步任务都在主线程上执⾏,形成⼀个执⾏栈。
2.主线程之外,还存在⼀个任务队列,存放异步事件,只要异步任务有了运⾏结果,就在任务队列之中放置⼀个事件。
3.⼀旦执⾏栈中的所有同步任务执⾏完毕,系统就会读取任务队列,将队列中的事件放到执⾏栈中依次执⾏。
4.主线程从任务队列中读取事件,直到所有任务执行完毕

任务栈

被主线程读取并执行的每个任务,就是任务栈

任务队列

任务队列与任务栈不同吗,它处理的是异步事件,主线程优先读取任务栈同步任务,遇到异步任务将其放入任务队列,继续向下执行。当任务队列处理的异步事件有了结果后,主线程会再度读取任务队列中的回调函数。

调用实例

let a = () => {
    console.log('a--start')
    setTimeout(() => {
      console.log('异步任务a完成')
    }, 0)
    console.log('a--end')
  }
  let b = () => {
    console.log('b--start')
    setTimeout(() => {
      console.log('异步任务b完成')
    }, 0)
    console.log('b--end')
  }
  let c = () => {
    console.log('c--start')
    setTimeout(() => {
      console.log('异步任务c完成')
    }, 0)
    console.log('c--end')
  }
  a();
  b();
  c();



在这里插入图片描述

  • 先执行同步任务,异步任务放入任务队列,当所有同步任务执行结束,依次执行任务队列中的异步任务,先进先出

宏任务/微任务

  • 宏任务(macrotask):
    • script(整体代码)、setTimeout、setInterval
  • 微任务(microtask):
    • Promise、process.nextTick(Node.js环境)
  • 执行顺序,先宏后微

在这里插入图片描述

  • 注意,放入队列是先宏后微,但是再取出来的时候是先微后宏,这两个存在的事件队列是不一样的

面试题

setTimeout(function () {
    console.log(1);
});
new Promise(function(resolve,reject){
    console.log(2)
    resolve(3)
}).then(function(data){
    console.log(data);
})
console.log(4);

//2 4 3 1

// 宏任务
setTimeout        异步
console.log(2)  同步
console.log(4)   同步



//微任务
Promise,then  异步