事件环

来源:互联网 发布:jenkins 编译java项目 编辑:程序博客网 时间:2024/06/05 11:32

js事件环到底是什么呢。。

先写一写自己的理解:

js代码的运行主要在栈和队列中,一般同步的任务都是放入主线程(执行栈)中,异步的操作(比如callback)都是先放入到任务队列。

首先先将栈中的代码运行完毕,其中运行过程如果有异步操作,就放到任务队列中。

当栈的代码运行完毕,再取出任务队列放入主线程,依次处理队列中的代码,如果又有了异步任务又放入新的任务队列中。因此形成环。

 

回到常用的

setTimeout(func,delay) 它的作用其实是在delay后将func放入任务队列中。setTimeout(func, 0)其实是把func放到下一次event loop中执行(每提取一次队列放入执行栈就是一次event loop)

process.nextTick 将该代码放入本次栈的尾部,优先于任务队列。如果有多个process.nextTick语句(不管它们是否嵌套),将全部在当前"执行栈"执行。

setImmediate方法则是在当前"任务队列"的尾部添加事件,和setTimeout(func, 0)很像

promise.then放在本次栈的尾部


周末看了一片文章http://blog.csdn.net/fuohua/article/details/70919983

事件循环的顺序,决定了JavaScript代码的执行顺序。它从script(整体代码)开始第一次循环。之后全局上下文进入函数调用栈。直到调用栈清空(只剩全局),然后执行所有的micro-task。当所有可执行的micro-task执行完毕之后。循环再次从macro-task开始,找到其中一个任务队列执行完毕,然后再执行所有的micro-task,这样一直循环下去。

 

  • 一个线程中,事件循环是唯一的,但是任务队列可以拥有多个。

  • 任务队列又分为macro-task(宏任务)与micro-task(微任务),在最新标准中,它们被分别称为task与jobs。

  • macro-task大概包括:script(整体代码), setTimeout, setInterval, setImmediate, I/O, UI rendering。

  • micro-task大概包括: process.nextTick, Promise, Object.observe(已废弃), MutationObserver(HTML5新特性)

  • setTimeout/Promise等我们称之为任务源。而进入任务队列的是他们指定的具体执行任务。


原创粉丝点击