简述JavaScript事件循环EventLoop

1,564 阅读3分钟

JavaScript事件循环,是js运行顺序最基本的机制,本文用简单通俗的语言讲解一下JavaScript事件循环是怎么运行的。希望能对大家理js解事件循环有所帮助 

 

        本文只是帮助理解,用词不会很谨慎,如果在正式场合使用,请自行翻译成高大上的专业词汇。

        大家都知道JavaScript是单线程的,代码都在执行栈中执行。那么我写了那么老多代码,好多好多,一坨一坨的,哪都是。程序怎么选择执行着一坨坨一堆堆的代码谁先谁后呢。这就需要事件循环来机制来处理了

首先在这套机制里有这三个东东。执行栈、宏任务、微任务

执行栈,是用来执行我们写的代码的,怎么执行本文阐述,只要知道它是执行代码用的就行了

宏任务,可以理解为存放等待执行栈中执行代码用的,它是个队列。先进先出

微任务,和宏任务一样也是存代码用的,等待被执行栈执行的,它也是个队列。先进先出

宏任务和微任务都是存代码的,为啥整俩呢?

为啥整俩,emmm。。。小明你出去

宏任务和微任务区别就是底层如何选择放入执行栈中执行,也就是放入执行栈的规则是不一样的。

下面就说说规则是啥。这个规则其实就是JavaScript的时间循环机制(eventLoop)

首先什么会被放入宏任务,什么会被放入微任务呢。这个是已经规定好的。

宏任务包括:

主任务(例如一个script标签,在html中一个script标签就是一个宏任务)
setTimeout
setInterval
I/O
UI交互事件
postMessage
MessageChannel
setImmediate(Node.js 环境)

微任务包括:

Promise.then
Object.observe
MutaionObserver
process.nextTick(Node.js 环境)

知道了谁是宏任务谁是微任务,也就是有了原料了,怎么加工呢,

第二就是机制怎么运转

上图解释:


一个js程序(比如一个网页被打开)一开始是酱婶的,为什么只有宏任务有东西。因为开始运行,我们写的代码还没开始执行,底层只能看到我们写的一坨坨代码,也就是主任务。所以一开始,底层会把所有静态主程序怼到宏任务里。等待执行

下面就开始执行了,继续上图


宏1被压入执行栈执行,在宏1执行中有可能产生宏任务和微任务,只要产生宏或微,就按照产生的顺序插入到相应的任务队列尾部。

接下来宏1执行完毕,宏1出栈


接下来,底层会检查微任务队列中有没有任务。如果有就会执行所有等待执行的微任务


在微任务运行过程中也有可能产生微任务和宏任务。一样,只要产生宏或微,就按照产生的顺序插入相应的队尾。

微1执行完毕,出栈,接下来微2会入栈执行,然后是微3入栈执行



所有微任务执行完毕,这时才会重新从宏任务队列中选择下一个任务执行,直到所有任务执行完毕







最后来个动画