我一直在阅读Javascript的内部知识(在chrome浏览器的上下文中,我有一些问题似乎找不到适当的答案。
根据我的理解:
V8中包含核心Javascript(根据ECMA规范)发动机。
settimeout
之类的功能由浏览器的Web API提供。
V8引擎包括一个调用堆栈和任何要被执行的被推入该堆栈。
然后通过Web API调用非标准函数。
这些完成时将被推送到回调队列。
一旦堆栈为空,回调队列中的所有内容都会被推送通过事件循环进入堆栈。
我的问题是,当V8引擎解释Javascript代码时,如何知道某个特定功能来自Web API? Web API实际如何与引擎链接?
API像setTimeout()
被添加到Javascript的global
对象中。当JS引擎寻求解析符号时,它从本地范围开始,并向上延伸一系列范围。链的最末端是global
范围。过去,浏览器环境中的全局作用域与window
对象相同,但是随着class
功能的出现,浏览器Javascript中的某些内容现在在全局作用域中可用,而不是在window
对象。
因此,将在浏览器中Javascript的顶级添加的任何API(例如setTimeout()
)都添加到global
对象。全局对象