事件循环机制
进程与线程
进程与线程区别?
本质上来说,两个名词都是 CPU 工作时间片的一个描述 进程描述了 CPU 在运行指令及加载和保存上下文所需的时间,放在应用上来说就代表了一个程序。 线程是进程中的更小单位,描述了执行一段指令所需的时间。 答案: 进程是一个完整的过程,而线程就是这个完整过程中的片段。好比你去食堂吃饭可以说是一个进程。这其中进入食堂,打饭,吃饭,洗碗都是组成这个进程的片段,又叫线程。 把这些概念拿到浏览器中来说,当你打开一个 Tab 页时,其实就是创建了一个进程,一个进程中可以有多个线程,比如渲染线程、JS 引擎线程、HTTP 请求线程等等。当你发起一个请求时,其实就是创建了一个线程,当请求结束后,该线程可能就会被销毁。
JS 单线程带来的好处?
两个线程是互斥的。大家应该都知道,在 JS 运行的时候可能会阻止 UI 渲染,这说明了两个线程是互斥的。这其中的原因是因为 JS 可以修改 DOM,如果在 JS 执行的时候 UI 线程还在工作,就可能导致不能安全的渲染 UI。这其实也是一个单线程的好处,得益于 JS 是单线程运行的,可以达到节省内存,节约上下文切换时间,没有锁的问题的好处。当然前面两点在服务端中更容易体现,对于锁的问题,形象的来说就是当我读取一个数字 15 的时候,同时有两个操作对数字进行了加减,这时候结果就出现了错误。解决这个问题也不难,只需要在读取的时候加锁,直到读取完毕之前都不能进行写入操作。
执行栈
什么是执行栈
答案: 可以认为是一个存储 将要调用的函数的一个栈结构的容器。 根据先进后出的原则,后执行的函数在释放内存时会先弹出栈 ( 如下图:

在平时使用中,也可以看到执行栈的痕迹,比如递归的时候,如果存放函数过多,就会报错,即masxium call stack is exceeded(即爆栈) 事件回调机制(Event Loop) 异步代码执行顺序? 什么是 Event Loop ?
浏览器中的时间循环机制
就是一个代码执行顺序的机制。顺序如下: 1.执行所有宏任务,红任务中同步代码优先,然后才是异步代码
2.执行所有微任务
3.然后渲染
4.开始下一轮 Event Loop,执行宏任务中的异步代码
微任务包括 process.nextTick ,promise ,MutationObserver
宏任务包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering
node中的事件循环机制
(暂不做整理,有必要的话可以看掘金小册(《前端面试之道》第7章)) Node 中的 Event Loop 和浏览器中的有什么区别? process.nexttick 执行顺序?