繁体   English   中英

为什么我们需要VariableEnvironment来识别Javascript中一个执行上下文的state?

[英]Why do we need VariableEnvironment to identify the state of an Execution Context in Javascript?

在 ECMAScript 规范中,声明:

词汇环境:

标识用于解析此执行上下文中的代码所做的标识符引用的词法环境。

还,

执行上下文的 LexicalEnvironment 和 VariableEnvironment 组件始终是 Lexical Environments。 创建执行上下文时,它的 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值。

然后:

通常,词法环境与 ECMAScript 代码的某些特定句法结构相关联,例如 FunctionDeclaration、BlockStatement 或 TryStatement 的 Catch 子句,并且每次评估此类代码时都会创建一个新的词法环境

问题是,为什么我们首先需要一个 VariableEnvironment,因为 LexicalEnvironment 似乎足以跟踪变量值绑定?

现在,让我们看一下 JavaScript [评论中的问题] 中的代码示例:

 var a = 1; function x(b){ var c = 2; // During the creation phase of the excution context of the function // the ifStatement Block will it be skipped? if(c >= 1){ let d = 3; // Does e belongs to the Lexical Environment of the IfStatementBlock or to the FunctionDeclaration? var e = 4; a = 5; } }

VariableEnvironment用于范围为整个 function 的名称,而LexicalEnvironment用于范围为最近的封闭块的名称(EcmaScript 6 的letconst声明)。

在您的示例中, ce都属于 function 的变量环境。 var声明被提升到 function 的顶部,但除非输入if块,否则不会初始化e 所以它相当于:

 var a = 1; function x(b) { var c = 2; var e; if (c >= 1) { let d = 3; e = 4; a = 5; } }

为什么我们首先需要一个 VariableEnvironment,因为 LexcicalEnvironment 似乎足以跟踪变量值绑定?

VariableEnvironmnet 的原因是确保有一个可以使用的本地 scope 不会干扰现有范围。 如果没有 VariableEnvironment,就根本没有作用域,因为 LexicalEnvironment 会通过执行代码不断地改变。

VariableEnvironment - 标识其 EnvironmentRecord 保存由此执行上下文中的 VariableStatements 创建的绑定的词法环境。

这绝对是需要的。

在function的执行上下文的创建阶段,if语句块会被跳过吗?

不,它不会。 if语句不是新执行上下文的触发器,因此 scope 将成为 function 的变量环境的一部分,该环境将包含一个内部 LexicalEnvironment。

e 属于 IfStatementBlock 的词法环境还是属于 FunctionDeclaration?

e变量被提升,因为它是一个var ,因此它是 function x 的变量环境的一部分。 d值是内部 LexicalEnvironment 的一部分,该内部 LexicalEnvironment 是由if块内的let声明创建的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM