Event Loop
js是单线程的,如果js变成了多线程的话会引发一个问题,在同一时间内操作DOM,一个删除一个增加。这样js就乱了不知道该干嘛了!所以js是单线程的。
随着HTML5的到来,js也支持了多线程webWorker但是也不允许操作DOM。
单线程意味着所有的任务都需要排队,后面的任务必须要等前面的任务执行完毕才能执行,如果前面的任务耗时过长,后面的任务就需要一直等。所以在js中出现了异步的概念。
同步任务
同步任务是放在执行栈中立即执行的,代码的执行顺序依次从上到下执行。
异步任务
异步任务会被放到任务队列里边,等待同步任务都执行完了再依次进入执行栈开始执行。
宏任务
常见的宏任务包括:整个script、setTimeout、setInterval、UI交互事件、postMessage、Ajax
微任务
Promise.then、Promsie.catch、Promise.finally、process.nextTick(node环境下)。
运行机制
所有的同步任务都是在主进程执行的形成一个执行栈。主线程之外还存在一个“任务队列”,异步任务先进入任务队列进行等待,等待主线程中的所有同步任务执行完毕后,看看本次任务队列中是否有“微任务”,有的话将本次的微任务依次执行完毕,都执行完后再看看有没有下一轮宏任务,有的话执行下一轮宏任务,然后执行宏任务内的同步任务--->微任务--->下一次宏任务......