[英]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 的let
和const
声明)。
在您的示例中, c
和e
都属于 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.