大家好,
在第一篇文章中,我将写有关事件循环(主循环、主线程、事件线程等…)的内容,这是真正想了解 Javascript 的人思考的主题之一。我还想补充一点,这篇文章将是我自己做的笔记的汇编,而不是专业的。我为我的错误提前道歉。
在下图中,您可以看到 NodeJS 中的 JavaScript v8 引擎、事件循环机制和 libuv 库。 libuv 库可以执行一些 Javascript 无法提供的任务。如果我们在浏览器中运行 javascript,我们就会使用浏览器提供的 Web api 来运行。
事件循环是一种架构设计模式。这种方式之所以受到青睐,与javascript的工作原理有直接关系。 javascript 运行单线程和非阻塞 i/o。换句话说,虽然它运行在单线程上,但在执行耗时任务时并没有被阻塞,而是继续工作。它通过事件循环架构解决了这个问题。
当程序运行时,全局执行上下文被创建并添加到调用堆栈中。在程序流程完成之前,不会将其从调用堆栈中删除。事实上,为每个函数创建了一个执行上下文。一旦函数完成,它就会从调用堆栈中删除。但它并不总是这样。
在某些情况下,函数需要时间才能完成其功能。例如,网络请求或来自文件的数据读写操作、dom 事件(并非全部)。在这种情况下,该函数由线程池或Web API 处理。当进程完成时,回调函数被添加到回调队列(任务队列)中。当轮到它时(当调用堆栈清空时),它被转移到调用堆栈并被处理。一旦处理完毕,它就会从调用堆栈中删除。微任务队列中的作业先于回调队列中的作业处理。例如 promise、Mutation Observer、queueMicrotask
Node.js 中的线程池和浏览器中的 Web Workers 用于执行需要密集 CPU 能力的异步操作和作业。我不会在这里讨论它们在用法和范围上的差异。我想说的是:我们可以使用不同的机制来处理 JavaScript 无法处理的任务。