js事件循环机制(Event Loop)浏览器端学习总结

js是单线程的语言,但是在实际的运行中存在着同步任务和异步任务。在运行过程中,在js引擎执行js的过程中,如果遇到异步任务的时候,就交给事件处理线程(Web APIs),由事件处理线程根据其性质分别放入不同的任务队列中。

js的任务分为Macro Task(宏任务)Micro Task(微任务),

macrotask包括:script(整体代码片段)、setTimeout、setInterval、I/O、UI交互、setImmediate(Node.js 环境)

microtask包括:Promise、MutaionObserver、process.nextTick(Node.js 环境)

当主线程运行完一个宏任务后,会循环微任务队列并执行,之后判断微任务队列是否为空,如果不为空继续执行,如果为空则去访问宏任务队列继续执行下一个宏任务。直到两个队列都清空。

事例:

async function async1() { 
    console.log('async1 start') 
    await async2() 
    console.log('async1 end')
}

async function async2() {
    console.log('async2')
}

console.log('script start')

setTimeout(function() {
    console.log('setTimeout')
}, 0) 

async1()

new Promise(function(resolve) { 
    console.log('promise1') 
    resolve()
}).then(function() {
    console.log('promise2')
})

console.log('script end') 

结果:script start;  async1 start;  async2;  promise1script end;  async1 end;  promise2;  setTimeout; 

(注:await会阻塞后面代码的执行,用一个匿名函数包裹await语句之后的代码作为一个微任务事件)

参考:

前端开发都应该懂的事件循环(event loop)以及异步执行顺序(setTimeout、promise和async/await)

深入理解JavaScript事件循环机制 - ChessZhang - 博客园

深入理解js事件循环机制(浏览器篇) - lynnelv's blog

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值