渲染引擎和 JavaScript 引擎如何在浏览器中通信?

How do the Render Engine and JavaScript Engine Communicate in a browser?

我正在寻找这方面的详细答案。

我已经知道的

所以我对调用堆栈和回调有了一些了解,浏览器通过 web APIs 添加功能,通过事件循环添加回调。我还在某处读到有关具有 API.

的 JS 引擎的信息

我想了解的

谢谢!

从(C++ 等)应用程序开发的角度来看,JavaScript 引擎是可嵌入的库;浏览器就是这样一种嵌入器。任何库都定义了一个可以使用它的 public 接口——它的应用程序编程接口(或简称 API)。对于 JS 引擎的 API 应该是什么样子,没有标准;每个引擎都定义了自己的引擎,并随着时间的推移根据需要对其进行改进。 V8 是 here.

JS 引擎 API 的核心功能是允许嵌入器向 JavaScript 环境提供由嵌入器自己的 C++ 实现支持的对象和函数。本质上,这定义了一个映射,有时也称为“绑定”。例如,嵌入器可以说“我想要一个 document 对象,它应该看起来有一个 属性 .location,它由我的 getter 函数 DocumentLocationGetter() {...},并且它应该(似乎)有一个方法 .createElement(),由我的其他函数 DocumentCreateElement(...) {...}” 支持,等等。

这就是您两个问题的答案:浏览器将某些功能公开给 JavaScript,然后可以从那里调用这些功能。浏览器决定调用此类函数时要做什么(例如:添加或删除 DOM 节点,更改 CSS 属性,将事件处理程序存储在某个元素的事件处理程序列表中, ...)。当然browser/embedder也可以调用JS引擎,比如调用事件处理器时,可以告诉引擎“请立即执行函数button1_clicked”。

有关详细信息,请参见例如v8.dev/docs/embed.