理解事件循环

js的执行线程有
主线程:也就是 js 引擎执行的线程,这个线程只有一个,页面渲染、函数处理都在这个主线程上执行。
工作线程:也称幕后线程,这个线程可能存在于浏览器或js引擎内,与主线程是分开的,处理文件读取、网络请求等异步事件。

任务队列:所有的任务可以分为同步任务和异步任务,同步任务是立即执行的任务,同步任务一般会直接进入到主线程中执行;而异步任务,就是异步执行的任务,比如ajax网络请求,setTimeout 定时函数等都属于异步任务,异步任务会通过任务队列的机制(先进先出的机制)来进行协调。

同步和异步任务分别进入不同的执行环境,同步的进入主线程,即主执行栈,异步的进入任务队列。主线程内的任务执行完毕为空,会去任务队列读取对应的任务,推入主线程执行。 上述过程的不断重复就是我们说的 Event Loop (事件循环)。

宏任务主要包含:script( 整体代码)、setTimeout、setInterval、I/O、UI 交互事件、setImmediate(Node.js 环境)
微任务主要包含:Promise、MutaionObserver、process.nextTick(Node.js 环境)

来做一道题目来理解一下:

console.log('1);

setTimeout(function() {
  console.log('2');
}, 10);

new Promise(resolve => {
    console.log('3');
    resolve();
    setTimeout(() => console.log('4'), 10);
}).then(function() {
    console.log('5')
})

console.log('6');

首先执行主线程,输出1,把2放入宏任务队列,输出3,把4放入宏任务队列,把5放入微任务队列里,输出6。
再执行一轮微任务,输出5
把微任务执行完了,开始执行宏任务,输出2和4
所以最后输出的顺序是1,3,6,5,2,4

需要注意的三点:

  1. clearInterval(interval); 运行的时候,实际上已经执行了 interval 的macrotask了
  2. promise函数内部是同步处理的,不会放到队列中,放入队列中的是它的then或catch回调
  3. promise的then返回的还是promise,所以在输出promise后,继续检测到后续的then方法,马上放到microtask队列尾部,再继续取出执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值