javascript-VarDeclaredNames和VarScopedDeclarations有什么区别?
作者:互联网
我正在阅读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有什么区别?能给我一些例子吗?
谢谢.
解决方法:
这两个静态语义规则在AST中搜索相同的内容:VariableDeclarations,ForBindings,FunctionDeclarations和GeneratorDeclarations.确实有很多重复(特别是在方法论上).
但是,正如@loganfsmyth在评论中提到的那样,它们确实返回不同的数据-不同类型的列表.虽然VarDeclaredNames返回名称(字符串)列表,但VarScopedDeclarations确实返回声明列表(即AST节点).
这在将某些内容实际附加到列表的部分中很明显:§13.3.2.2、§13.7.4.5、§13.7.5.7和§13.2.9都确实引用了相应元素的BoundNames,而§13.3.2.3、§13.7.4.6、§13.7.5.8和§13.2.10确实引用了相应声明本身.
为什么需要这种区别? VarDeclaredNames用于在范围内创建绑定,而VarScopedDeclarations用于查找要创建的函数声明(并使用这些值初始化绑定).
会更简单吗?是的,可以肯定-对于词法声明,scope initialisation description只是迭代声明并获取每个声明的BoundNames.您可能希望向规范作者提交一个错误,以便也将这种方法用于函数级声明.参见issue 1203对此进行讨论.
标签:ecma262,javascript,ecmascript-6 来源: https://codeday.me/bug/20191010/1886024.html