我一直在阅读Javascript的内部知识(在chrome浏览器的上下文中),但我有几个问题似乎找不到适当的答案。
根据我的理解:
V8引擎中包含核心Javascript(根据ECMA规范)。
settimeout
浏览器的Web API提供了类似的功能。
V8引擎包括一个调用堆栈,任何要执行的Javascript都会推送到该堆栈上。
然后通过Web API调用非标准函数。
这些完成时将被推送到回调队列。
一旦堆栈为空,事件循环会将回调队列上的所有内容压入堆栈。
我的问题是,当V8引擎解释Javascript代码时,如何知道某个特定功能来自Web API?Web API实际如何与引擎链接?
诸如此类setTimeout()
的API已添加到global
Javascript对象中。当JS引擎寻求解析符号时,它从本地范围开始,并向上延伸一系列范围。范围的最末端是global
范围。
宿主环境可以作为初始化V8引擎的一部分,将其自己的API添加到V8引擎的全局范围中,这正是浏览器为V8尚未内置的功能所做的事情。
浏览器中的全局对象的概念比可能应该的有点混乱。多年来,全局对象一直是window
对象。所有可全局访问的主机环境功能,例如,setTimeout()
都是window
对象的属性。
同样,在浏览器的顶级范围内声明任何变量将自动使这些变量成为window
对象的属性。
这太乱了。当出现newclass
关键字时,他们决定不再继续使情况变得更糟,因此在浏览器的顶级范围内声明的类在全局范围内可用,但不作为window
对象的属性添加。
当node.js环境出现时,他们将用户代码组织到模块中,目标是使全局变量尽可能少。在这种环境中,全局变量是名为的对象的属性global
。您在node.js模块的顶层声明的变量仅作用于模块内。什么都不会自动成为全局变量,但是global
如果您愿意,您可以为该对象显式分配一个新属性,例如:
global.myProperty = 3;
尽管在node.js模块化设计中强烈建议不要这样做。
因此,在初始化V8引擎时,浏览器环境会将setTimeout()
添加到ECMAScript规范之外的,在浏览器中Javascript顶层添加的任何API都添加到global
对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句