事件环

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等我们称之为任务源。而进入任务队列的是他们指定的具体执行任务。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值