EventLoop事件循环
由于js是单线程的,同步执行任务会造成阻塞,所以我们就将js分成一个个的任务,通过循环来一次执行他们,我们可以在挂起一个异步任务的时候去做其他的事情,而不一定需要等待这个时间执行完毕。所以事件循环的机制基本如下:
1.检查事件队列是否为空,如果为空,则继续检查;如不为空,则执行下一步;
2.取出事件队列的首部,压入执行栈;
3,执行任务;
4,检查执行栈,如果执行栈为空,则跳回第 1 步;如不为空,则继续检查;
宏任务以及微任务
宏任务以及微任务是用来划分异步任务类型的。不同类型的事件会有不同的运行顺序
宏任务包括:script(整体代码),I/O, setTimeout,setInterval,requestAnimationFrame,setImmediate。
其中setImmediate只存在于Node中,requestAnimationFrame只存在于浏览器中。
微任务包括: Promise.then,Object.observe(已废弃),MutationObserver(html5新特性),process.nextTick。
其中process.nextTick只存在于Node中,MutationObserver只存在于浏览器中。
前面我们介绍,事件循环会将其中的异步任务按照执行顺序排列到事件队列中。
然而,根据异步事件的不同分类,这个事件实际上会被排列到对应的宏任务队列或者微任务队列当中去。
当执行栈中的任务清空,主线程会先检查微任务队列中是否有任务,如果有,就将微任务队列中的任务依次执行,直到微任务队列为空,之后再检查宏任务队列中是否有任务,如果有,则每次取出第一个宏任务加入到执行栈中,之后再清空执行栈,检查微任务,以此循环... ...同一次事件循环中,微任务永远在宏任务之前执行。