# 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)出

Last Updated: 7/15/2020, 10:34:45 PM