【发布时间】:2019-01-03 17:53:27
【问题描述】:
在ECMAScript specification 中,我们在哪里可以找到关于为什么let 和const 在使用BlockStatements 创建的词法环境 之外无法访问的明确说明(而不是用var) 声明的变量?
如果 BlockStatements 现在创建 new lexical environments,则 let 和 const 声明不应创建可在该词法环境之外访问的变量,但 var 变量应该创建。我试图了解在最新的 ECMAScript 规范中究竟在哪里指定了该行为。
来自13.3.1 Let and Const Declarations:
let 和 const 声明定义了范围为正在运行的执行上下文的 LexicalEnvironment 的变量。变量是在实例化包含它们的词法环境时创建的,但在评估变量的词法绑定之前不得以任何方式访问。
var 语句声明了范围为正在运行的执行上下文的 VariableEnvironment 的变量。 var 变量在其包含的词法环境被实例化时创建,并在创建时初始化为 undefined。
正如所见,两个变量声明都在其包含的词法环境被实例化时创建变量。在 BlockStatement 的情况下是编译器进入块的时间。
执行上下文的 LexicalEnvironment 和 VariableEnvironment 组件始终是 Lexical Environments
【问题讨论】:
-
只是
vars 在输入函数(或全局或评估)作用域时创建和初始化,而lets 和consts 在输入任何作用域时创建。它没有在任何地方明确说明它们之前没有创建和访问过。 -
因为新的变量环境只为函数创建
-
@Bergi 谢谢。 Scope 并没有真正被规范使用。你的意思是
var变量仅在为函数创建 Lexical Environments 时创建?如果是这样,如何在函数之外创建var变量?我正在尝试理解它,仅配备 ECMAScript 规范。 -
@JonasW 很有趣,谢谢。我会稍微消化一下,如果有任何疑问,我会回复。
-
@JonasW。我一直在颠倒规范,但很难发现 VariableEnvironments 只是为函数创建的。您能否添加一个答案,显示您遵循规范中的哪些步骤来得出上述结论?
标签: javascript ecmascript-6 ecmascript-2017