我正在阅读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.
它们看起来一样。所以我想知道VarDeclaredNames
和VarScopedDeclarations
之间的区别是什么?你能给我一些例子吗?
感谢。
答案 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讨论此内容。