宏任务与微任务

JS 的执行机制

javascript是一门单线程语言,一切的 javascript 版的"多线程"都是用单线程模拟出来的。

多线程: 程序可以同一时间做几件事。 单线程: 程序同一时间只能做一件事。

JS为什么需要异步?

如果JS中不存在异步,只能自上而下执行,如果上一行解析时间很长,那么下面的代码就会被阻塞。 对于用户而言,阻塞就意味着"卡死",这样就导致了很差的用户体验。

宏任务(macro-task)

宏任务是指宿主发起的任务(浏览器/node)。 包括:

  • 同步 script (整体代码)
  • 定时器
  • 事件绑定
  • ajax
  • 回调函数
  • Node中fs可以进行异步的I/O操作
  • UI rendering

微任务(micro-task)

微任务是指 js 引擎发起的任务。 包括:

  • process.nextTick:node中实现的api,把当前任务放到主栈最后执行,当主栈执行完,先执行nextTick,再到等待队列中找
  • Promise(async/await) :Promise并不是完全的同步,在promise中是同步任务,执行resolve或者reject回调的时候,此时是异步操作,会先将then/catch等放到微任务队列。当主栈完成后,才会再去调用resolve/reject方法执行
  • MutationObserver:创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。

1、首先 JavaScript 引擎会执行一个宏任务,注意这个宏任务一般是指主干代码本身,也就是目前的同步代码 2、执行过程中如果遇到微任务,就把它添加到微任务任务队列中 3、宏任务执行完成后,立即执行当前微任务队列中的微任务,直到微任务队列被清空 4、微任务执行完成后,开始执行下一个宏任务 如此循环往复,直到宏任务和微任务被清空。

例子:

console.log('script start');
setTimeout(function(){
    console.log('setTimeout');
},0);
new Promise(function(resolve){
    console.log('promise1');
    resolve();
    console.log('promise2');
}).then(function(){
    console.log('promise then');
});
console.log('script end');

具体到这道题目,执行顺序是:

首先执行一个宏任务,即所有同步代码,依次打印出: script start promise1 promise2 script end 第一步宏任务执行完成,检查微任务队列,发现微任务队列中有:Promise的then回调函数,立即执行微任务队列。打印出:promise then

然后执行接下来的宏任务,执行setTimeout的回调函数,打印出:setTimeout。

此题还需要注意:setTimeout和setInterval的回调函数是宏任务,但是题目中的setTimeout和setInterval本身是属于主干代码的;

同理打印promise1和promise2的那两行虽然处于 Promise 的回调函数中,但是这个函数的立即同步执行的,所以也属于主干代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值