Javascript v8 引擎和 Web API

The Javascript v8 engine and Web APIs

我一直在阅读 Javascript 的内部结构(在 chrome 浏览器的上下文中),我有几个问题似乎无法找到正确的答案。

据我了解:

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

API 像 setTimeout() 被添加到 Javascript 中的 global 对象。当 JS 引擎要解析一个符号时,它从局部作用域开始,然后向上延伸一个作用域链。链的最后是 global 作用域。

作为初始化 V8 引擎的一部分,宿主环境可以将它自己的 API 添加到 V8 引擎的全局范围中,这正是浏览器对它不需要的东西所做的事情已经内置在 V8 中。

浏览器中的全局对象的概念比它可能应该是的有点混乱。多年来,全局对象是 window 对象。所有全局可访问的宿主环境函数,如 setTimeout() 都是 window 对象的属性。

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

这很快就变得一团糟。当新的 class 关键字出现时,他们决定不再让这种情况变得更糟,因此在浏览器的顶级范围内声明的 类 全局可用,但不会添加为 window对象。

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

global.myProperty = 3;

尽管在 node.js 模块化设计中强烈反对这样做。

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