Javascript v8 引擎和 Web API
The Javascript v8 engine and Web APIs
我一直在阅读 Javascript 的内部结构(在 chrome 浏览器的上下文中),我有几个问题似乎无法找到正确的答案。
据我了解:
Core Javascript(根据 ECMA 规范)包含在 V8 中
引擎。
像settimeout
这样的功能是由浏览器的Web APIs提供的。
V8 引擎包括一个调用堆栈和任何 Javascript
执行的被推到这个堆栈上。
然后通过 Web API 调用非标准函数。
这些在完成时被推送到回调队列。
一旦堆栈为空,回调队列中的任何内容都会被推送
通过事件循环进入堆栈。
我的问题是当 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 引擎时。
我一直在阅读 Javascript 的内部结构(在 chrome 浏览器的上下文中),我有几个问题似乎无法找到正确的答案。
据我了解:
Core Javascript(根据 ECMA 规范)包含在 V8 中 引擎。
像
settimeout
这样的功能是由浏览器的Web APIs提供的。V8 引擎包括一个调用堆栈和任何 Javascript 执行的被推到这个堆栈上。
然后通过 Web API 调用非标准函数。
这些在完成时被推送到回调队列。
一旦堆栈为空,回调队列中的任何内容都会被推送 通过事件循环进入堆栈。
我的问题是当 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 引擎时。