函数调用栈任务队列事件轮询

Posted yunnex-xw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数调用栈任务队列事件轮询相关的知识,希望对你有一定的参考价值。

最近接触nodeJs中,了解到了这三个概念。这三个概念在14年,阮一峰老师写了一篇博客,扑灵大神在此基础上完善了,、

对于小菜鸟,简直是神仙对话,不懂,不明白。

阮一峰: http://www.ruanyifeng.com/blog/2014/10/event-loop.html

扑灵:https://blog.csdn.net/lin_credible/article/details/40143961。

后续看到一篇文章,个人觉得写的比较好 https://www.cnblogs.com/liangyin/p/9783342.html

 

函数调用栈:(call stack)

  index.js

  技术分享图片

特点: 执行前入栈,执行后出栈。a先执行完 a先出栈,后续就是B出栈,接着就是整个全局上下文出栈,成为空栈。

 

任务队列:(task queue)

队列特点: 先进先出。 

在单线程的js中,任务分为同步任务和异步任务。

同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务。

异步任务:不进入主线程、由其他线程执行,将回调函数放入到任务队列中或者叫事件队列中,执行完毕后,触发回调函数,回调函数重新加入到函数调用栈中,接着就是前面所讲的出栈。

 

技术分享图片

 

 输出结果是 "1" "2" "set2" "setTimeout"

第一步: setTimeout 是个异步任务,回调函数加入任务队列,主线程先执行后续的任务。

第二步:for循环同步任务,  console.log("1") 先进栈,后出栈。

第三步: setTimeout 跟第一步处理一致。

第四步: for循环同步任务 console.log("2") 先进战。后出栈。

第五步: 栈任务完成之后,会不断轮询,任务队列中的回调函数,回调函数重新进入主线程的调用栈,输出数据,完成出栈。

 

 

事件轮询:

就是不断重复上面所说的步骤,只要主线程栈执行完毕之后,就会取执行任务队列中的回调函数。完成进栈和出栈。

 

最后附上一张图加以理解:

 

技术分享图片

 

以上是关于函数调用栈任务队列事件轮询的主要内容,如果未能解决你的问题,请参考以下文章

同步异步和Event loop事件循环

JavaScript Event Loop事件循环

浏览器中的JavaScript事件循环机制

浏览器中的JavaScript事件循环机制

前端面试必问:Js事件循环机制Eventloop

前端进击的巨人:栈堆队列内存空间