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

问题描述

我正在寻找有关此问题的详细答案。

我已经知道的

所以我对调用堆栈和回调有一些了解,并且浏览器通过 Web API 添加功能,这些 API 通过事件循环添加回调。我还在某处阅读了有关具有 API 的 JS 引擎的信息。

我想了解什么

  • Web API 如何向 JS 引擎公开? (如果这是关于 具有 API 的 JS 引擎,关于该 API 如何工作的一些描述 做)
  • 渲染引擎的行为如何通过 JavaScript,比如操作 DOM、CSSOM 等? (如果我明白 正确,这相当于询问 Web API 是如何工作的)

谢谢!

解决方法

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

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

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...