一.消息队列

调用栈:当前正在执行的代码

消息队列:等待执行的代码

示例代码:

setTimeout(() => {
    console.log('love')
}, 2000);

setTimeout(() => {
    console.log('why')
}, 1000);

for(let i = 0 ; i<10000 ; i++){
    console.log('always')
}

肯定是先执行的同步代码,for循环输出'always',但是循环次数多,而一直在执行的这一块代码,前面两个延时器的调用输出就会暂时停下,等到这串同步代码执行完毕后才会执行,此时的同步代码就位于调用栈,而why,和love则是排在消息队列中的,并且因为why的延时短,所以它相较于love先执行,排在前面消息队列的前面

执行顺序:同一模块队列中,先微后宏

所以:

调用栈:for循环console.log('always')

消息队列:'why'调用函数,'love'调用函数

二.EventLoop

EventLoop:不停循环检查调用栈里是否有代码,如果没有,就把消息队列首位的函数,放到调用栈去执行