2016-11-15 4 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의, ForBinding의, FunctionDeclaration들과 GeneratorDeclaration의 :

+1

§13.1이 정적 의미를 설명하는 유일한 섹션이 아닙니다. – Bergi

+0

@Bergi 죄송합니다. "다음을 참조하십시오 : 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

그 두 정적 의미 규칙 사물의 같은 종류의 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

답장을 보내 주셔서 감사합니다! 그런데 스펙을 읽는 것에 대한 제안을 할 수 있습니까? 때로는 이해할 수없는 몇 가지 용어 또는 디스크가 있기 때문에. 다시 한 번 감사드립니다! @ 베르 기 –