javascript - 为什么我们需要 VariableEnvironment 来识别 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用于范围为整个函数的名称,而LexicalEnvironment用于范围为最近的封闭块(EcmaScript 6let
和const
声明)的名称。
在您的示例中,c
两者e
都属于函数的VariableEnvironment。var
声明被提升到函数的顶部,但除非进入块,e
否则不会被初始化。if
所以它相当于:
var a = 1;
function x(b) {
var c = 2;
var e;
if (c >= 1) {
let d = 3;
e = 4;
a = 5;
}
}
推荐阅读
- css - 是否可以为 CSS 蒙版图像设置动画?
- pycharm - Pycharm:Numpy 安装包失败
- sql - 按 SQL 排序未按预期工作,我不知道它在做什么,但我想要一种简单的日期升序
- c - 如何在 c 语言中使用带有开放 ssl 的 aes cbc 128 位加密结果获取密文
- crystal-lang - 无法在水晶语言中使用 File.tempfile - 未定义对 `*Crystal::System::Dir::tempdir:String' 的引用
- c++ - 编译器可以省略那些被地址获取但从未被调用的函数体吗?
- logging - 如何为 glib 调试日志添加文件名、行、函数的前缀
- java - Dagger:在为 Kotlin 嵌套类生成的组件代码中找不到符号错误
- php - 如何将查询构建器代码转换为 laravel eloquent(获得更快的大量数据)?
- python - 添加新元素时Heapify不起作用