最近在看一些vue
源码,涉及到eventloop
的问题,看了网上的一些文章也是越看越迷。
首先,一个完整的eventloop
过程:执行栈执行同步任务->执行栈执行微任务回调->执行栈执行宏任务回调(我的理解),然后在适当时候渲染。
第一个让我不解的点就是:反复执行这个eventloop
过程,为何会反复?场景是什么样的?
就拿一个很简单的vue页面来说,从数据监听到页面渲染(包含添加的一些peomise
、settimeout
等等)这不就是一个完整的eventloop
过程?还会再来一个吗?
然后就是那个nextTick说是在下个tick
执行,看了下nextTick
的源码是用的promise
、settimeout
异步操作,难道不是跟上面属于一个eventloop
?为什么还是下个tick
呢?
不知道表达的清不清楚,请各位大佬解惑。
到底何为一个eventloop
呢?什么是一个eventloop
开始和结束标志呢?
Javascript
是单线程的,所有任务都要排队等候处理,如果有些任务非常耗时,将会一直占用着资源,而且CPU也未得到充分的利用。所以我们先将一些任务先挂起,等有返回结果再进行处理,这时候就用到eventloop
了。JavaScript
引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈(其中会产生微任务和宏任务)。当执行栈为空后,会将任务队列里面取出任务放入执行栈里面执行,如此反复循环。