VarDeclaredNames和VarScopedDeclarations之间的区别是什么?

时间:2016-11-15 12:18:14

标签: javascript ecmascript-6 ecma262

我正在阅读EcmaScript规范。

在9.2.12,有:

11.Let varNames be the VarDeclaredNames of code. 
12.Let varDeclarations be the VarScopedDeclarations of code.

在13.1.5和13.1.6:

13.1.5 Static Semantics: VarDeclaredNames

Statement :

EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Return a new empty List.

13.1.6 Static Semantics: VarScopedDeclarations

Statement :

EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
Return a new empty List.

它们看起来一样。所以我想知道VarDeclaredNamesVarScopedDeclarations之间的区别是什么?你能给我一些例子吗?

感谢。

1 个答案:

答案 0 :(得分:2)

这两个静态语义规则在AST中搜索相同类型的内容: VariableDeclaration s, ForBinding s, FunctionDeclaration s和 GeneratorDeclaration 秒。确实有很多重复(特别是在方法论上)。

但是,正如@loganfsmyth在评论中提到的那样,它们会返回不同的数据 - 不同类型的列表。虽然VarDeclaredNames返回一个名称列表(字符串),但VarScopedDeclarations确实返回一个声明列表(即AST节点)。

在列表中实际附加了某些内容的部分中显而易见:§13.3.2.2§13.7.4.5§13.7.5.7§13.2.9都引用了{{1相应元素虽然§13.3.2.3§13.7.4.6§13.7.5.8§13.2.10确实引用了相应的声明本身。

为什么需要这种区别? BoundNames用于在作用域中创建绑定,而VarDeclaredNames用于查找要创建的函数声明(并使用这些值初始化绑定)。

它可以更简单吗?是的,当然 - 对于词法声明,scope initialisation description只是迭代声明并得到每个声明VarScopedDeclarations您可能希望向规范作者提交一个错误,以便将此方法用于函数级声明。请参阅issue 1203讨论此内容。