任务分两种:node
一种是同步任务(synchronous),另外一种是异步任务(asynchronous)。ajax
"任务队列"是一个先进先出的数据结构,排在前面的事件,优先被主线程读取。主线程的读取过程基本上是自动的,只要执行栈一清空,"任务队列"上第一位的事件就自动进入主线程。可是,因为存在后文提到的"定时器"功能,主线程首先要检查一下执行时间,某些事件只有到了规定的时间,才能返回主线程数组
Js 中,有两类任务队列:宏任务队列(macro tasks)和微任务队列(micro tasks)。宏任务队列能够有多个,微任务队列只有一个。那么什么任务,会分到哪一个队列呢?浏览器
微任务:process.nextTick, Promise, Object.observer, MutationObserver.
咱们上面讲到,当stack空的时候,就会从任务队列中,取任务来执行。共分3步:数据结构
更新UI渲染。多线程
Event Loop 会无限循环执行上面3步,这就是Event Loop的主要控制逻辑。其中,第3步(更新UI渲染)会根据浏览器的逻辑,决定要不要立刻执行更新。毕竟更新UI成本大,因此,通常都会比较长的时间间隔,执行一次更新。异步
js既然是单线程,那么确定是排队执行代码,那么怎么去排这个队,就是Event Loop。虽然JS是单线程,但浏览器不是单线程。浏览器中分为如下几个线程:async
其中JS线程和UI线程相互互斥,也就是说,当UI线程在渲染的时候,JS线程会挂起,等待UI线程完成,再执行JS线程.函数
主线程从"任务队列"中读取事件,这个过程是循环不断的,因此整个的这种运行机制又称为Event Loop(事件循环)。oop
在进程启动时,node便会建立一个相似while(true)的循环,每执行一次循环体的过程咱们称为tick,每一个tick的过程就是查看是不是否有事件等待处理,若是有,就取出事件及其相关的回调函数。若是有关联的回调函数,就执行他们,而后进入有下一个循环体
回调函数保存在数组中,在一轮循环中数组中的回调函数所有执行完
回调函数存在链表中,每一次循环只执行链表中的一个回调函数
时间复杂度lg(n)
时间复杂度lg(n)