【发布时间】:2015-08-28 07:31:20
【问题描述】:
我正在阅读ECMAScript 2015 specification,并且多次使用术语“LexicalEnvironment”和“VariableEnvironment”。它们在表 23 中定义:
LexicalEnvironment:标识用于解析此执行上下文中的代码所做的标识符引用的词法环境。
VariableEnvironment:标识其 EnvironmentRecord 保存由此执行上下文中的 VariableStatements 创建的绑定的词法环境。
执行上下文的 LexicalEnvironment 和 VariableEnvironment 组件始终是 Lexical Environments。创建执行上下文时,其 LexicalEnvironment 和 VariableEnvironment 组件最初具有相同的值。
所以,我想知道它们会有什么不同,以及各自用于哪些情况。谁能解释一下?
【问题讨论】:
-
Clarity on the difference between “LexicalEnvironment” and “VariableEnvironment” in ECMAScript 5 可能重复?他们的目的并没有真正改变,只是当前的词法环境被更频繁地交换(例如,每个块作用域)。
-
是的,我以前读过它,但我还是有些麻烦。你说
try {throw "some"} catch(x) { function y(){console.log(x, typeof x);} y(); },我在chrome下运行,但是没有throws a ReferenceError for x@Bergi -
@SmallTownNE 谢谢,我更新了that answer。但是“有趣的事实”并不是这篇文章的主旨——主要的一点是当你进入一个块作用域时 LexicalEnvironment 会发生变化(例如
catch,因为 ES6 也是普通块——对于let和const等) -
谢谢。我还有一些问题。我能总结一下
LexicalEnvironment是静态的,VariableEnvironment是动态的吗?(因为我看了kangax's answer)@Bergi -
你认为
VariableEnvironment在同一个执行上下文中永远不会改变。但是kangax's answer 表示LexicalEnvironment在同一个执行上下文中永远不会改变。这让我很困惑。你能解释一下吗? @贝尔吉