JavaScript 事件循环和 Node.js 事件循环有什么区别?

What is the different between JavaScript Event loop and Node.js Event loop?

在JavaScript中,引擎中使用了事件循环。这是一张图来说明这个 article.


(来源:mybalsamiq.com

对于Node.js,事件循环也在这里实现。引自此 question.

The Node.js event loop runs under a single thread, this means the application code you write is evaluated on a single thread. Nodejs itself uses many threads underneath trough libuv, but you never have to deal with with those when writing nodejs code.

但是,node.js事件循环对我来说仍然是抽象的。

What's the difference between those two event loops?

没有。 Nodejs JavaScript 引擎1.

1:或者更确切地说,其中之一,还有其他引擎实现相同的语言和相同的事件循环概念。

Is there any image to introduce it more clearly?

有很多。但我认为动画更好 :-) Philip Roberts 的 This jsconf talk 到处都受到称赞。

Nodejs 事件循环实现不同于 browser-based 事件循环一。

这是 Nodejs 社区中的一个巨大混乱点。

虽然 Nodejs 使用 Google V8 作为其运行时,但它不使用 V8 来实现事件循环。

Nodejs 使用 Libuv 库(用 C 语言编写)来实现事件循环。

您上面的图适用于 JS 事件循环,但不适用于 Nodejs 事件循环。

为了完全理解 Nodejs 事件循环,您应该学习三个参考资料:

  1. https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
  2. http://docs.libuv.org/en/v1.x/design.html
  3. https://www.youtube.com/watch?v=sGTRmPiXD4Y

chromenode都有自己的event-loop

浏览器或节点中的事件循环不是 V8 的一部分。事件循环是浏览器或节点

提供的不同application/dependency/library的一部分 他们不使用 V8 的事件循环。

V8确实实现了事件循环,就是there.

然而,它意味着被覆盖或替换,这是 Chrome 和 NodeJS 碰巧做的事情。

浏览器(Chrome)

V8只是执行你的JavaScript(If和else语句,for语句,函数,算术运算e.t.c),然后将操作交给Libevent

在浏览器中(例如Chrome)除了JavaScript引擎V8(Chrome使用V8),浏览器还包含不同的applications/dependencies/libraries可以做多种发送 HTTP 请求、监听 DOM 事件、使用 setTimeout 或 setInterval 延迟执行、缓存、数据库存储等等。

因此浏览器(例如Chrome)使用依赖项 Libevent 来实现事件循环。


Node.js

V8只是执行你的JavaScript(If和else语句,for语句,函数,算术运算e.t.c),然后将操作交给Libuv。 JavaScript 默认不支持网络和文件系统操作。 Libuv 与 V8 一起工作,因此 V8 将 运行 JavaScript 而 Libuv 将处理 I/O 任务。

在Node.js中,除了JavaScript引擎V8,Node还包含不同的applications/dependencies/libraries,它可以做各种各样的事情,比如网络,文件系统操作,监听系统事件,使用 setTimeout、setInterval、setImmediate、process.nextTick 等延迟执行。

因此Node.js使用依赖Libuv来实现事件循环。


如果回调队列(阶段)中没有任务,则节点的事件循环处于空闲状态,但Chrome的事件循环保持运行宁

Chrom's event loop is like merry-go-round while Node's event loop is like Roller coaster

还有其他的区别,你可以看看here