参考链接:浏览器事件循环机制 & 面试一定会问到的-js事件循环
JS是单线程的
虽然JS运行在浏览器中是单线程的,但是浏览器是事件驱动的(Event driven),浏览器中很多行为是异步(Asynchronized)的,会创建事件并放入执行队列中。浏览器中很多异步行为都是由浏览器新开一个线程去完成,一个浏览器至少实现三个常驻线程:
- JS引擎线程
- GUI渲染线程
- 事件触发线程
JS引擎
JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中,比如最出名的就是Chrome浏览器的V8引擎,如下图所示,JS引擎主要有两个组件构成:
- 堆-内存分配发生的地方
- 栈-函数调用时会形一个个栈帧
执行栈
function bar() {
console.log('bar');
}
function foo() {
console.log('foo');
bar();
}
foo();
执行过程中栈的变化
宏任务Macrotasks(Task)
- script
- setTimeout
- setInterval
- setImmediate
- I/O
- UI rendering
微任务Microtasks(Job)
- process.nextTick
- promises(new Promise不算,then后面的才是)
- Object.observe
- MutationObserver