1、进程与线程
- 进程:可以理解为一个程序(浏览器打开一个页面就是开辟了一个进程)
- 线程:程序中具体做事情的人
一个进程中可以包含很多线程,一个线程同时只能做一个事情
2、同步编程与异步编程
- 同步编程:一件一件的去做,上一件事情没有完成,则无法处理下一个事情【单线程】
- 异步编程:上一个事情未完成,下一个事情可以继续处理【多线程,基于单线程的EventLoop机制...】
3、js中的异步编程(宏任务、微任务)
- 异步微任务:promise、async/await 【generator】、requestAnimationFrame
- 异步宏任务:定时器、ajax【HTTP网络请求】、事件绑定...
- js中大部分代码都是同步编程,但是可以基于单线程的EventLoop(事件循环机制)实现出异步的效果
4、浏览器多线程
打开一个页面,浏览器会分配很多现场,同时处理一些事情
- GUI渲染线程:自上而下渲染页面
- JS引擎(渲染)线程:JS单线程是因为,浏览器只会开辟这一个线程,来执行JS代码
- HTTP网络请求现场:加载资源文件和一些数据
- 定时器监听线程:监听定时器是否到达时间
- DOM事件监听现场:监听DOM事件的触发
- ...
5、JS中的事件循环机制【EventLoop】
代码执行顺序:同步任务-->异步微任务-->异步宏任务
严格按照这个顺序执行,代码自上而下执行,遇到异步任务,将这些任务先存放到【EventQueue】任务队列中,不执行,主线程继续向下执行同步任务;全部同步任务执行完之后,待主线程空闲下来,才开始处理微任务,待微任务全部处理完成之后,才处理宏任务。
异步任务中的优先执行顺序:
- 先执行微任务
- 微任务中:一般是谁先放置的谁先执行
- 宏任务中:一般是谁先到达的谁先执行
☆多个定时器的时候,执行过程中要注意执行时间,有些的定时器在同步任务还未完成时,就到达时间了,就要与【后面的定时器】区分开来,之前的定时器还是按照到达时间的先后顺序执行
☆小知识点:time监测【受系统性能的影响】
console.time('AA');
console.timeEnd('AA');
浏览器抛出异常,也会阻碍主线程的渲染
- 死循环:主线程被彻底占用死,后面的任务都无法处理
- 抛出异常:只会影响下面的同步任务不执行,已经放到EventQueue事件队列中的异步任务继续执行