编程语言
首页 > 编程语言> > javascript-VarDeclaredNames和VarScopedDeclarations有什么区别?

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