事件循环原理
JS是单线程的,异步代码时如何执行? 因为浏览器是多线程的,异步任务是由浏览器的定时器线程处理。 浏览器也是多进程的,打开一个tab,至少要启动四个进程:浏览器主进程、渲染进程、网络进程、GPU进程
进程vs线程
进程
一个进程就是一个程序的运行实例 启动一个进程,系统会为它开辟一块内存,用来存放代码、运行中的数据和一个执行任务的主线程
浏览器的多进程:浏览器主进程、渲染进程层、插件进程、网络进程、GPU进程…
线程
线程可以启动多个并行处理任务,提升性能,但是它不能单独存在, 线程依赖进程管理和启动
浏览器的多线程:http线程、js引擎线程、定时器线程…
事件循环
- JS在解析时将同步代码放入执行栈
- 遇到异步任务时交给其他线程处理,异步任务完成后将回调放入任务队列
- setTimeout:定时器线程
- ajax:http线程
- 所有同步代码执行(出栈)完成后,去任务队列里取出已完成异步任务的回调加入执行栈继续执行
- 回调里遇到异步任务时再交给其他线程处理,如此循环往复,即事件循环
任务队列(宏任务vs微任务)
任务队列不止一个,按种类分为宏任务、微任务
宏任务
- 宿主环境(浏览器)发起的任务称宏任务(重学前端)
- 下次循环任务开始执行(队头执行)
- 浏览器中的宏任务:setTimeout、setInterval、点击事件、键盘事件
微任务
- JS引擎发起的任务
- 本次循环结束后执行(队尾执行)
- 浏览器中的微任务:Promise.then、Promise.catch
- 微任务优先级通常会高于宏任务,先于宏任务执行