JavaScript 是单线程的,同一时间只能做一件事。
JavaScript 的主要用途是在浏览器中实现交互,这决定着 JavaScript 只能单线程。
为了解决单线程运行阻塞问题,在 JavaScript 中,所有的任务都可以分为:
-
同步任务:立即执行的任务,同步任务一般会直接进入到主线程(js 引擎)中执行。
-
异步任务:先放入宿主环境(浏览器、node)的任务队列中,等待主线程执行完毕后,再从任务队列中取出执行。
事件循环
- js 是单线程,为了防止单线程阻塞,将任务分为异步任务和同步任务。
- 同步任务在 js 主线程执行,异步任务在宿主环境(浏览器、node)的任务队列中。
- 异步任务会在合适的时机被送入任务队列中。
- js 主线程执行完毕后,从任务队列中取出任务执行。
以上过程就是事件循环。
微任务和宏任务
异步任务还可以细分为微任务与宏任务。
微任务
- MutationObserver
- Promise.then
- process.nextTick(node)
宏任务
- setTimeout
- setInterval
- UI渲染
- script
- setImmediate、I/O(node)
宏任务和微任务执行顺序
- 执行一个宏任务,如果遇到微任务就将它放到微任务的事件队列中。
- 当前宏任务执行完成后,会查看微任务的事件队列,然后将里面的所有微任务依次执行完。