简述浏览器和 Node.js 中的事件循环 ?
参考答案:
浏览器和Node.js中的事件循环都是为了处理JavaScript的单线程特性和异步操作而设计的。事件循环的主要目标是确保代码按照正确的顺序执行,即使这些代码是异步的。
浏览器中的事件循环:
- 初始化阶段:浏览器加载并解析JavaScript代码。
- 事件监听阶段:开发者为各种事件(如点击、滚动、键盘输入等)添加监听器。当这些事件发生时,相关的回调函数会被添加到任务队列中。
- 任务执行阶段:浏览器按照任务队列的顺序执行任务。JavaScript代码执行会进入执行栈,而其他任务(如网络请求、UI渲染等)会在执行栈为空时执行。
- 渲染阶段:浏览器将页面绘制到屏幕上。
Node.js中的事件循环:
- 初始化阶段:当Node.js启动时,它会初始化事件循环机制。
- 监听阶段:开发者可以通过添加事件监听器来处理各种事件,如文件系统操作、网络请求等。
- 事件触发阶段:当相应的事件发生时,Node.js会将事件回调函数添加到任务队列中。
- 执行阶段:Node.js按照任务队列的顺序执行任务。与浏览器不同的是,Node.js的执行栈中不仅可以执行JavaScript代码,还可以执行其他类型的回调函数。
宏任务和微任务:
事件循环由宏任务和在执行宏任务期间产生的微任务组成。宏任务包括脚本(整体代码script)、setTimeout、setInterval、setImmediate(Node.js环境)、I/O、UI渲染等。微任务包括Promise.then、MutationObserver、process.nextTick(Node.js环境)等。在执行一个宏任务的过程中,产生的所有微任务都会被加入到微任务队列中,在当前宏任务执行完后,会立即执行所有的微任务。只有当所有的微任务都执行完毕后,才会开始下一个宏任务的执行。这就是所谓的“事件循环”。