1. JS
是单线程
- JS语言的一大特点就是
单线程
,也就是说同一时间只能做一件事情
。 - 这是因为JS这门脚本语言诞生的使命所致(
JS是为处理页面中用户的交互,以及操作DOM诞生的
)。 - 比如对某个DOM元素进行添加删除操作,不能同时进行,应该
先添加后删除
2. JS
单线程导致的问题
- 单线程就意味着,
所有任务需要排队
,前一个任务结束,才会执行后一个任务。 - 这样所导致的问题是:如果JS执行时间过长就会造成页面渲染不连贯,导致页面渲染加载阻塞的感觉
- 比如定时器的延迟时间,就需要等待
3. 同步和异步
- 为了解决单线程的问题,利用多核CPU的计算能力,HTML5 提出
Web Worker
标准,允许JS脚本创建多个线程
。
于是JS出现了同步
和异步
-
同步:
前一个任务执行完再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。 -
异步:
在做一件事情的时候,因为这件事情会花费很长时间,在做这件事情的同时,还可以去处理其它事情
。
4. 同步任务
- 同步任务都在主线程上执行,形成一个
执行栈
5. 异步任务
- JS 的异步是通过回调函数实现的。
- 一般而言,异步任务有以下
三种类型
:
a.普通事件
,如:click、resize等
b.资源加载
,如:load、error等
c.定时器
,setInterval、setTimeout等 - 异步任务相关的回调函数添加到
任务队列中
(任务队列也称为消息队列)
6. JS
执行机制
- 先执行
执行栈中的同步任务
- 异步任务(
回调函数
)放入任务队列中 - 一旦执行栈中的所有同步任务执行完毕,系统会按次序读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行,执行完之后,主线程再查询任务队列有没有任务,有就取出来放到执行栈中执行
- 由于主线程不断重复的
获得任务、执行任务、再获得任务、再执行
,所以这种机制被称为事件循环(eventloop)