javascript - Javascript v8 引擎和 Web API

标签 javascript node.js google-chrome v8

我一直在研究 Javascript 的内部结构(在 chrome 浏览器的上下文中),并且我有一些问题,但我似乎找不到正确的答案。

据我了解:

  • 核心 Javascript(根据 ECMA 规范)包含在 V8 中 引擎。

  • settimeout 这样的函数是由浏览器的 Web API 提供的。

  • V8 引擎包括一个调用堆栈和任何需要执行的 Javascript 执行后被插入该堆栈。

  • 然后通过 Web API 调用非标准函数。

  • 这些完成后被推送到回调队列。

  • 一旦堆栈为空,回调队列上的任何内容都会被推送 通过事件循环入栈。

我的问题是,当 V8 引擎解释 Javascript 代码时,它如何知道特定函数来自 Web API? Web API 是如何与引擎实际关联的?

最佳答案

setTimeout() 这样的 API 被添加到 Javascript 中的 global 对象中。当 JS 引擎寻求解析符号时,它从本地作用域开始,并向上延伸一系列作用域。链的最末端是全局范围。

作为初始化 V8 引擎的一部分,主机环境可以将其自己的 API 添加到 V8 引擎中的全局范围,而这正是浏览器对其所需但尚未内置于 V8 中的内容所做的操作。

浏览器中全局对象的概念比它应有的要困惑一些。多年来,全局对象一直是 window 对象。所有可全局访问的主机环境函数(例如 setTimeout())都是 window 对象的属性。

类似地,在浏览器中声明顶级范围的任何变量都会自动使这些变量成为 window 对象的属性。

事情很快就变得困惑了。当新的 class 关键字出现时,他们决定不再让这种困惑变得更糟,因此在浏览器中顶级范围声明的类可以全局使用,但不会添加为 的属性>窗口对象。

当 Node.js 环境出现时,他们将用户代码组织到模块中,目标是拥有尽可能少的全局变量。在该环境中,全局变量是名为 global 的对象的属性。您在 Node.js 模块顶层声明的变量的作用域仅限于模块内。没有什么会自动成为全局变量,但如果您愿意,您可以显式地将新属性分配给 global 对象,例如:

global.myProperty = 3;

尽管在 Node.js 模块化设计中强烈建议不要这么做。

因此,在浏览器中 Javascript 顶层添加的任何 ECMAScript 规范之外的 API(例如 setTimeout())都会通过以下方法添加到 global 对象中:初始化V8引擎时的浏览器环境。

关于javascript - Javascript v8 引擎和 Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316975/

相关文章:

javascript - 使用 Node 创建 id_rsa 文件时格式无效

node.js - 如何将多个 Azure Active Directory 帐户连接到您的应用程序?

javascript - 在 chrome IOS 选项卡上打开 base64 pdf

javascript - typeahead.js、localStorage 和大型 json 文件

javascript - jwt.verify() 的 Node.js 回调

javascript - 从 html5 canvas 生成的图像无法保存在 chrome 中

javascript - 具有多个条件的多个 <td>

javascript - 页面退出确认

Canvas 上的 Javascript SVG 绘图在事件阶段 2 失败

node.js - Vogels 是使用 Nodejs 的 Amazon dynamodb 映射器的不错选择吗?