JavaScript Event Loop事件循环机制理解

JavaScript Event Loop

JavaScript是一门单线程的语言,它的异步和多线程的实现是通过event loop事件循环机制来实现的大体有三个部分组成,调用栈(call stack)、消息队列(Message Queue)、微任务队列(Microtask Queue)

优先级是调用栈>微任务>消息队列

①全是同步方法
function func1(){
    cosole.log(1);
}
function func2(){
    console.log(2);
    func1();
    console.log(3);
}
func2();

上面代码的事件循环是(以下"压入栈"用"入"代替,"弹出栈’'用"出"代替):func2()入,console.log(2)入,console.log(2)出,func1()入,cosole.log(1)入,cosole.log(1)出,func1()出,console.log(3)入,console.log(3)出,func2()出。

②加入异步操作,如:setTimeout(),setInterval()等

它们中的回调函数会入队到消息队列中,称为"消息",消息会在调用栈清空时执行。

function func1(){
    cosole.log(1);
}
function func2(){
    setTimeout(()=>{
        console.log(2);
    },0);
    func1();
    console.log(3);
}
func2();

上面代码的事件循环是:func2()入, setTimeout(()=>{console.log(2);},0)入,console.log(2)进入消息队列(回调函数进入消息队列),setTimeout(()=>{},0)出, func1()入, cosole.log(1)入, cosole.log(1)出, func1()出,console.log(3)入,console.log(3)出,func2()出,console.log(2)入,console.log(2)出。

③使用Promise、async/await创建的异步操作会加入到微任务队列中。

当调用栈清空的时候就会立即执行,优先级高于"消息"

var p=new Promise(resolve=>{
    console.log(4);
    resolve(5);
});
function func1(){
    cosole.log(1);
}
function func2(){
    setTimeout(()=>{
        console.log(2);
    },0);
    func1();
    console.log(3);
    p.then(resolved=>{
       console.log(resolved) 
    }).then(()=>{
        console.log(6)
    });
}
func2();

上面代码的事件循环是:new Promise()首先被压入调用栈,console.log(4)入,console.log(4)出,resolve(5)入,resolve(5)出,func2()入, setTimeout(()=>{console.log(2);},0)入,console.log(2)进入消息队列(回调函数进入消息队列),setTimeout(()=>{},0)出, func1()入, cosole.log(1)入, cosole.log(1)出, func1()出,console.log(3)入,console.log(3)出,p.then(resolved=>{
console.log(resolved)})和then(()=>{console.log(6)})两个回调函数会入队到微任务队列中,func2()出,一旦调用栈清空就执行微任务队列中的事件,console.log(resolved)入,console.log(resolved)出,console.log(6)入,console.log(6)出,再执行消息队列中的消息console.log(2)入,console.log(2)出

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值