(1) JS是单线程语言segmentfault
(2) JS的Event Loop是JS的执行机制。异步
Event Loop (事件循环):函数
只要主线程空了,就去读取“任务队列”,从任务队列中读取事件,这个过程是循环不断的,因此整个的这个运行机制叫 Event Loop。oop
主线程运行的时候,产生堆(head)和栈(stack),栈中的代码(同步任务)调用各类外部API,它们在“任务队列”(异步任务)中加入各类事件(click, load, done 等), 只要栈中的代码(同步任务)执行完毕,主线程就会去读取“任务队列”(异步任务),依次去执行那些事件所对应的回调函数。ui
除了广义的同步任务和异步任务,咱们对任务更准确的划分方式是:lua
Macrotask (宏任务):spa
包括总体代码script线程
etImmediate:把回调函数放在事件队列的尾部3d
setTimeout:定时器code
setInterval:定时器
Microtask 微任务):
process.nextTick:把回调函数放在当前执行栈的底部
Promise:
按照这种分类方式:JS的执行机制是:
重复以上2步骤,就是更为准确的JS执行机制了。
Node.js的Event Loop:
1. V8引擎解析JavaScript脚本。
2. 解析后的代码,调用Node API。
3. libuv库负责Node API的执行。它将不一样的任务分配给不一样的线程,造成一个Event Loop(事件循环),以异步的方式将任务的执行结果返回给V8引擎。
4. V8引擎再将结果返回给用户。
(1)JS为何是单线程的?
JavaScript的主要用途主要是用户互动,和操做DOM。若是JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另外一个线程删除了这个节点,这时这两个节点会有很大冲突,为了不这个冲突,因此决定了它只能是单线程。
(2)为何须要异步?
若是JS中不存在异步,只能自上而下执行,若是上一行解析时间很长,那么下面的代码就会被阻塞。 对于用户而言,阻塞就意味着"卡死",这样就致使了不好的用户体验。
因此,JS中存在异步执行。
JS是经过的事件循环(event loop),理解了event loop机制,就理解了JS的执行机制
这段setTimeout代码什么意思? 咱们通常说: 3秒后,会执行setTimeout里的那个函数
setTimeout(function(){ console.log('执行了') },3000)
可是这种说并不严谨,准确的解释是: 3秒后,setTimeout里的函数被会推入event queue,而event queue(事件队列)里的任务,只有在主线程空闲时才会执行。
因此只有知足 (1)3秒后 (2)主线程空闲,同时知足时,才会3秒后执行该函数
若是主线程执行内容不少,执行时间超过3秒,好比执行了10秒,那么这个函数只能10秒后执行了