好的,所以我最近一直在阅读关于ES-5词汇环境范围的文章,我不确定我是否真的理解如何在EcmaScript中存储变量。我做了一些研究,但没有澄清我的信息,只提出了两个问题。所以他们就在这里:
activations objects/variable objects。在阅读了ES-3规范和互联网上的一些源代码之后,我可以假设它们只是普通的对象,比如那些由new Object创建的对象,但是没有一个源直接说“是的,这只是一个普通的对象”。此外,Dmitry Soshnikov在他的博客上写道(重点是我的):
根据的原理图,例如,可以将可变对象表示为普通的ECMAScript对象。这段引语并不能让我确定激活对象到底是什么。这是第一个问题:激活对象是常规的EcmaScript对象吗?如果没有,那又是什么原因呢?
object environment records,它似乎与ES-3激活对象大致相同,而declarative environment records则取代了函数中的激活对象并尝试-catch语句。因此,假设对象环境记录是只是普通的EcmaScript对象,那么什么是声明性环境记录?该规范没有澄清这一点,而且,从我在这里看到的内容来看,我无法想象这不是作为一个对象实现的。因此,同样,如果声明性环境记录不是ES对象,那么它们是什么以及它们是如何在代码执行过程中实现和表示的?谢谢你提前为我照亮了这个话题。
编辑:我想我需要澄清这个问题是关于什么的。我想知道的主要是激活对象/对象环境记录和声明性环境记录之间的确切区别。这就是我最感兴趣的。
发布于 2013-11-22 08:53:13
首先,你必须意识到,所有这些术语只是描述概念。它们不要求任何类型的实现。但是,由于这很难想象/可视化,所以帮助将这些概念视为您所知道的事物的实例化,比如映射或表。
声明性环境记录(DER)和对象环境记录(OER)有一个共同点:它们都是环境记录(ER),它们被定义为in the specification:
环境记录记录在其关联的词汇环境范围内创建的标识符绑定。
这基本上意味着ER跟踪变量和函数名以及它们的相关值。
考虑一下这个例子:
var foo = 42;
function bar() { };对应的ER将有两个条目,一个用于foo,一个用于bar。如果你把ER想象成一张桌子,那么它看起来就像
name value
----------------------
foo 42
bar <function object>现在来看一下DER和OER之间的区别。一个人可能是最容易理解的。
Declarative Environment Record
声明性这个词应该听起来很熟悉,因为我们经常谈论变量声明和函数声明。说明书上说:
每个声明性环境记录都与包含变量和/或函数声明的ECMAScript程序作用域相关联。声明性环境记录绑定由其作用域中包含的声明定义的标识符集。
所以,当你看到
var foo = 42;或
function bar() {
}然后,您可以假设它们的名称和值存储在DER中。
Object Environment Record
OER并不常见,但是在每个JS应用程序中至少有一个OER。该规范将其描述为
每个对象环境记录都与一个称为绑定对象的对象相关联。对象环境记录绑定与其绑定对象的属性名称直接对应的标识符名称集。
您有没有想过为什么window对象的属性是全局变量?这是因为全局范围的ER是一个OER:window是绑定对象,它的每个属性都在OER中创建了相应的条目。这在规范中也是如此:
全局环境记录是以全局对象为绑定对象的对象环境记录。
下面是一个示例:让我们假设绑定对象是
var obj = {
answer: 42
};那么OER将会是
name value
------------------------
answer 42注意,在本例中,绑定对象(obj)实际上是一个JavaScript对象。当您使用with语句时,您也处于相同的情况:
var obj = { foo: 42; };
with (obj) {
foo = foo / 2;
}
console.log(obj);with创建一个OER,并使用传递对象的属性名和值填充它。这就是为什么您可以通过obj.*访问它们而不显式地引用它们的原因。如果将绑定对象分配给其中一个标识符,则OER还确保使用新值更新绑定对象。
激活对象
在ES3中,激活对象( activation,AO)是在执行函数时自动创建的,它保存着对特殊arguments对象的引用。这似乎与DER有关,但仍然是独立的。
在ES5中,AOs的概念似乎不再存在,我认为这是不必要的,因为arguments可以直接添加到执行上下文中。
执行上下文
每当函数被执行时,都会建立一个新的执行上下文(EC),用于跟踪执行的状态:
执行上下文包含跟踪其相关代码的执行进度所需的任何状态。
这意味着引擎可以添加跟踪执行进度所需的任何信息。但是规范还定义了EC必须拥有的组件,其中之一是VariableEnvironment,它是一个ER (可能总是一个DER,但我不确定)。这意味着ER是EC的一部分。
https://stackoverflow.com/questions/20139050
复制相似问题