2016-11-15 1 views
-2

私はEcmaScript仕様書を読んでいます。 9.2.12でVarDeclaredNamesとVarScopedDeclarationsの違いは何ですか?

、があります。

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. 

彼らは私が違いますかを知りたいsame.Soのように見えますVarDeclaredNamesVarScopedDeclarationsの間?いくつかの例を教えてもらえますか?

ありがとうございました。 VariableDeclaration S、ForBinding S、FunctionDeclarationの sおよびGeneratorDeclaration S:

+1

§13.1はこれらの静的セマンティクスを詳述する唯一のセクションではありません – Bergi

+0

@Bergi申し訳ありませんが、私も知っています "See also:13.1.5,13.2.11,13.3.2.2,13.6.5,13.7.2.4,13.7.3.4 13.7.4.5,13.7.5.7,13.11.5,13.12.7,13.13.12,13.15.5,14.2.12,15.1.5,15.2.1.13 "である。しかし、私は13.1よりも詳細に問題を記述している他の説明は見つかりません。 –

+0

他の種類のステートメントのセクションでは、 'VarDeclaredNames'は' VarScopedDeclarations'とは異なります。 – Bergi

答えて

1

これら2つの静的意味規則は、物事の同じ種類のASTを検索します。確かに、(特に方法論の)重複がたくさんあります。

しかし、@loganfsmythはコメント内で言及しているように、さまざまな種類のリスト(異なる種類のリスト)を返します。 VarDeclaredNamesは名前(文字列)のリストを返しますが、VarScopedDeclarationsは宣言(つまりASTノード)のリストを返します。

これは何かが実際にリストに追加されたセクションでは明らかである:§13.3.2.2§13.7.4.5§13.7.5.7、そしてすべてが、それぞれの要素のBoundNamesを参照してください§13.2.9§13.3.2.3§13.7.4.6§13.7.5.8、および§13.2.10ながら参照くださいそれぞれの宣言自体。

なぜこの区別が必要ですか? VarDeclaredNamesはスコープ内でバインディングを作成するために使用され、一方、VarScopedDeclarationsは関数宣言を検索して検索します(これらの値でバインディングを初期化します)。

もっと簡単でしたか?はい、確かに - 字句宣言の場合、scope initialisation descriptionは宣言を反復し、それぞれのBoundNamesを取得します。関数レベルの宣言にもこのアプローチを使用するように、仕様作成者にバグを提出したいかもしれません。

+0

あなたの答えに感謝!ところで、スペックを読んでいくつか提案していただけますか?理解できない用語やディスカッションがいくつかあることもあります。再度、感謝します! @Bergi –

関連する問題