페이지 표시 설정

14 ECMAScript 언어: 문과 선언

구문

Statement[Yield, Await, Return] : BlockStatement[?Yield, ?Await, ?Return] VariableStatement[?Yield, ?Await] EmptyStatement ExpressionStatement[?Yield, ?Await] IfStatement[?Yield, ?Await, ?Return] BreakableStatement[?Yield, ?Await, ?Return] ContinueStatement[?Yield, ?Await] BreakStatement[?Yield, ?Await] [+Return] ReturnStatement[?Yield, ?Await] WithStatement[?Yield, ?Await, ?Return] LabelledStatement[?Yield, ?Await, ?Return] ThrowStatement[?Yield, ?Await] TryStatement[?Yield, ?Await, ?Return] DebuggerStatement Declaration[Yield, Await] : HoistableDeclaration[?Yield, ?Await, ~Default] ClassDeclaration[?Yield, ?Await, ~Default] LexicalDeclaration[+In, ?Yield, ?Await] HoistableDeclaration[Yield, Await, Default] : FunctionDeclaration[?Yield, ?Await, ?Default] GeneratorDeclaration[?Yield, ?Await, ?Default] AsyncFunctionDeclaration[?Yield, ?Await, ?Default] AsyncGeneratorDeclaration[?Yield, ?Await, ?Default] BreakableStatement[Yield, Await, Return] : IterationStatement[?Yield, ?Await, ?Return] SwitchStatement[?Yield, ?Await, ?Return]

14.1 문 의미론

14.1.1 Runtime Semantics: 평가

HoistableDeclaration : GeneratorDeclaration AsyncFunctionDeclaration AsyncGeneratorDeclaration
  1. empty를 반환합니다.
HoistableDeclaration : FunctionDeclaration
  1. FunctionDeclaration의 ? Evaluation을 반환합니다.
BreakableStatement : IterationStatement SwitchStatement
  1. newLabelSet을 새로운 빈 List로 둡니다.
  2. 인수 newLabelSet을 사용한 이 BreakableStatement의 ? LabelledEvaluation을 반환합니다.

14.2 블록

구문

BlockStatement[Yield, Await, Return] : Block[?Yield, ?Await, ?Return] Block[Yield, Await, Return] : { StatementList[?Yield, ?Await, ?Return]opt } StatementList[Yield, Await, Return] : StatementListItem[?Yield, ?Await, ?Return] StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return] StatementListItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] Declaration[?Yield, ?Await]

14.2.1 Static Semantics: 조기 오류

Block : { StatementList }

14.2.2 Runtime Semantics: 평가

Block : { }
  1. empty를 반환합니다.
Block : { StatementList }
  1. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  2. blockEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
  3. BlockDeclarationInstantiation(StatementList, blockEnv)을 수행합니다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 blockEnv로 설정합니다.
  5. blockValue를 Completion(StatementList의 Evaluation)으로 둡니다.
  6. blockValue를 Completion(DisposeResources(blockEnv.[[DisposableResourceStack]], blockValue))으로 설정합니다.
  7. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  8. ? blockValue를 반환합니다.
참고 1

제어가 어떤 방식으로 Block을 벗어나더라도 LexicalEnvironment는 항상 이전 상태로 복원됩니다.

StatementList : StatementList StatementListItem
  1. sl을 StatementList의 ? Evaluation으로 둡니다.
  2. s를 Completion(StatementListItem의 Evaluation)으로 둡니다.
  3. ? UpdateEmpty(s, sl)을 반환합니다.
참고 2

StatementList의 값은 StatementList에서 값을 생성하는 마지막 항목의 값입니다. 예를 들어 다음 eval 함수 호출은 모두 값 1을 반환합니다:

eval("1;;;;;")
eval("1;{}")
eval("1;var a;")

14.2.3 BlockDeclarationInstantiation ( code, envRecord )

추상 연산 BlockDeclarationInstantiation. 인수 code (구문 분석 노드) 및 envRecord (Declarative Environment 레코드). 반환값: unused. code는 블록 본문에 대응하는 Parse Node입니다. envRecord는 바인딩을 생성할 Environment Record입니다.

참고

Block 또는 CaseBlock이 평가될 때 새로운 Declarative Environment Record가 생성되고 블록 안에서 선언된 각 블록 스코프 변수, 상수, 함수 또는 클래스에 대한 바인딩이 해당 Environment Record에 인스턴스화됩니다.

호출되면 다음 단계를 수행합니다:

  1. decls를 code의 LexicallyScopedDeclarations로 둡니다.
  2. privateEnv를 실행 중인 실행 컨텍스트의 PrivateEnvironment로 둡니다.
  3. decls의 각 요소 decl에 대해 다음을 수행합니다.
    1. decl의 BoundNames의 각 요소 name에 대해 다음을 수행합니다.
      1. decl의 IsConstantDeclaration이 true이면, 다음을 수행합니다.
        1. ! envRecord.CreateImmutableBinding(name, true)를 수행합니다.
      2. 그렇지 않으면,
        1. Normative Optional
          호스트가 웹 브라우저이거나 그 밖의 방식으로 블록 수준 함수 선언의 웹 레거시 호환성 의미론을 지원하면, 다음을 수행합니다.
          1. ! envRecord.HasBinding(name)이 false이면, 다음을 수행합니다.
            1. ! envRecord.CreateMutableBinding(name, false)를 수행합니다.
        2. 그렇지 않으면,
          1. ! envRecord.CreateMutableBinding(name, false)를 수행합니다.
    2. decl이 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration 또는 AsyncGeneratorDeclaration 중 하나이면, 다음을 수행합니다.
      1. funcName을 decl의 BoundNames의 유일한 요소로 둡니다.
      2. funcObj를 인수 envRecord 및 privateEnv를 사용한 decl의 InstantiateFunctionObject로 둡니다.
      3. Normative Optional
        호스트가 웹 브라우저이거나 그 밖의 방식으로 블록 수준 함수 선언의 웹 레거시 호환성 의미론을 지원하면, 다음을 수행합니다.
        1. envRecord에서 funcName에 대한 바인딩이 초기화되지 않은 바인딩이면, 다음을 수행합니다.
          1. ! envRecord.InitializeBinding(funcName, funcObj)를 수행합니다.
        2. 그렇지 않으면,
          1. 단언: decl은 FunctionDeclaration입니다.
          2. ! envRecord.SetMutableBinding(funcName, funcObj, false)를 수행합니다.
      4. 그렇지 않으면,
        1. ! envRecord.InitializeBinding(funcName, funcObj)를 수행합니다.
  4. unused를 반환합니다.

14.3 선언과 Variable 문

14.3.1 Let, Const, Using 및 Await Using 선언

참고

let, const, using 및 await using 선언은 실행 중인 실행 컨텍스트의 LexicalEnvironment를 스코프로 하는 변수를 정의합니다. 변수는 이를 포함하는 Environment Record가 인스턴스화될 때 생성되지만 변수의 LexicalBinding이 평가되기 전까지는 어떤 방식으로도 접근할 수 없습니다. Initializer를 갖는 LexicalBinding이 정의한 변수에는 변수가 생성될 때가 아니라 LexicalBinding이 평가될 때 해당 Initializer의 AssignmentExpression 값이 할당됩니다. let 선언의 LexicalBinding에 Initializer가 없으면 LexicalBinding이 평가될 때 변수에 undefined 값이 할당됩니다.

구문

LexicalDeclaration[In, Yield, Await] : LetOrConst BindingList[?In, ?Yield, ?Await, +Pattern] ; UsingDeclaration[?In, ?Yield, ?Await] [+Await] AwaitUsingDeclaration[?In, ?Yield] LetOrConst : let const UsingDeclaration[In, Yield, Await] : using [no LineTerminator here] BindingList[?In, ?Yield, ?Await, ~Pattern] ; AwaitUsingDeclaration[In, Yield] : CoverAwaitExpressionAndAwaitUsingDeclarationHead[?Yield] [no LineTerminator here] BindingList[?In, ?Yield, +Await, ~Pattern] ; BindingList[In, Yield, Await, Pattern] : LexicalBinding[?In, ?Yield, ?Await, ?Pattern] BindingList[?In, ?Yield, ?Await, ?Pattern] , LexicalBinding[?In, ?Yield, ?Await, ?Pattern] LexicalBinding[In, Yield, Await, Pattern] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt [+Pattern] BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

보충 구문

다음 생성 규칙의 인스턴스를 처리할 때
AwaitUsingDeclaration : CoverAwaitExpressionAndAwaitUsingDeclarationHead BindingList ;
CoverAwaitExpressionAndAwaitUsingDeclarationHead의 해석은 다음 문법을 사용하여 구체화됩니다:

AwaitUsingDeclarationHead : await [no LineTerminator here] using

14.3.1.1 Static Semantics: 조기 오류

LexicalDeclaration : LetOrConst BindingList ; UsingDeclaration : using BindingList ; AwaitUsingDeclaration : CoverAwaitExpressionAndAwaitUsingDeclarationHead BindingList ; LexicalBinding : BindingIdentifier Initializeropt

14.3.1.2 Runtime Semantics: 평가

LexicalDeclaration : LetOrConst BindingList ;
  1. 인수 normal을 사용한 BindingList의 ? BindingEvaluation을 수행합니다.
  2. empty를 반환합니다.
UsingDeclaration : using BindingList ;
  1. 인수 sync-dispose를 사용한 BindingList의 ? BindingEvaluation을 수행합니다.
  2. empty를 반환합니다.
AwaitUsingDeclaration : CoverAwaitExpressionAndAwaitUsingDeclarationHead BindingList ;
  1. 인수 async-dispose를 사용한 BindingList의 ? BindingEvaluation을 수행합니다.
  2. empty를 반환합니다.

14.3.1.3 Runtime Semantics: BindingEvaluation

구문 지향 연산 BindingEvaluation. 인수 kind ((normal, sync-dispose 또는 async-dispose)). 반환값: (정상 완료 (값: unused) 또는 중도 완료). 다음 생성 규칙별로 정의된다.

BindingList : BindingList , LexicalBinding
  1. 인수 kind를 사용한 파생된 BindingList의 ? BindingEvaluation을 수행합니다.
  2. 인수 kind를 사용한 LexicalBinding의 ? BindingEvaluation을 반환합니다.
LexicalBinding : BindingIdentifier
  1. 단언: kind는 normal입니다.
  2. lhs를 ! ResolveBinding(BindingIdentifier의 StringValue)으로 둡니다.
  3. ! InitializeReferencedBinding(lhs, undefined)를 수행합니다.
  4. unused를 반환합니다.
참고

정적 의미론 규칙은 이 형태의 LexicalBinding이 const, using 또는 await using 선언에서 절대로 발생하지 않도록 보장합니다.

LexicalBinding : BindingIdentifier Initializer
  1. name을 BindingIdentifier의 StringValue로 둡니다.
  2. lhs를 ! ResolveBinding(name)으로 둡니다.
  3. IsAnonymousFunctionDefinition(Initializer)이 true이면, 다음을 수행합니다.
    1. value를 인수 name을 사용한 Initializer의 ? NamedEvaluation으로 둡니다.
  4. 그렇지 않으면,
    1. rhs를 Initializer의 ? Evaluation으로 둡니다.
    2. value를 ? GetValue(rhs)로 둡니다.
  5. kind가 normal이 아니면, 다음을 수행합니다.
    1. 단언: IsUnresolvableReference(lhs)는 false입니다.
    2. base를 lhs.[[Base]]로 둡니다.
    3. 단언: base는 Declarative Environment Record입니다.
    4. ? AddDisposableResource(base.[[DisposableResourceStack]], value, kind)를 수행합니다.
  6. ? InitializeReferencedBinding(lhs, value)를 수행합니다.
  7. unused를 반환합니다.
LexicalBinding : BindingPattern Initializer
  1. 단언: kind는 normal입니다.
  2. rhs를 Initializer의 ? Evaluation으로 둡니다.
  3. value를 ? GetValue(rhs)로 둡니다.
  4. envRecord를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  5. 인수 value 및 envRecord를 사용한 BindingPattern의 ? BindingInitialization을 반환합니다.

14.3.2 Variable 문

참고

var 문은 실행 중인 실행 컨텍스트의 VariableEnvironment를 스코프로 하는 변수를 선언합니다. var 변수는 이를 포함하는 Environment Record가 인스턴스화될 때 생성되고 생성 시 undefined로 초기화됩니다. 어떤 VariableEnvironment의 스코프 안에서도 동일한 BindingIdentifier가 둘 이상의 VariableDeclaration에 나타날 수 있지만, 이러한 선언은 전체적으로 하나의 변수만 정의합니다. Initializer를 갖는 VariableDeclaration이 정의한 변수에는 변수가 생성될 때가 아니라 VariableDeclaration이 실행될 때 해당 Initializer의 AssignmentExpression 값이 할당됩니다.

구문

VariableStatement[Yield, Await] : var VariableDeclarationList[+In, ?Yield, ?Await] ; VariableDeclarationList[In, Yield, Await] : VariableDeclaration[?In, ?Yield, ?Await] VariableDeclarationList[?In, ?Yield, ?Await] , VariableDeclaration[?In, ?Yield, ?Await] VariableDeclaration[In, Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]

14.3.2.1 Runtime Semantics: 평가

VariableStatement : var VariableDeclarationList ;
  1. VariableDeclarationList의 ? Evaluation을 수행합니다.
  2. empty를 반환합니다.
VariableDeclarationList : VariableDeclarationList , VariableDeclaration
  1. VariableDeclarationList의 ? Evaluation을 수행합니다.
  2. VariableDeclaration의 ? Evaluation을 반환합니다.
VariableDeclaration : BindingIdentifier
  1. empty를 반환합니다.
VariableDeclaration : BindingIdentifier Initializer
  1. name을 BindingIdentifier의 StringValue로 둡니다.
  2. lhs를 ? ResolveBinding(name)으로 둡니다.
  3. IsAnonymousFunctionDefinition(Initializer)이 true이면, 다음을 수행합니다.
    1. value를 인수 name을 사용한 Initializer의 ? NamedEvaluation으로 둡니다.
  4. 그렇지 않으면,
    1. rhs를 Initializer의 ? Evaluation으로 둡니다.
    2. value를 ? GetValue(rhs)로 둡니다.
  5. ? PutValue(lhs, value)를 수행합니다.
  6. empty를 반환합니다.
참고

VariableDeclaration이 with 문 안에 중첩되어 있고 VariableDeclaration의 BindingIdentifier가 with 문의 Object Environment Record의 바인딩 객체 프로퍼티 이름과 같으면, 5 단계는 Identifier의 VariableEnvironment 바인딩에 할당하는 대신 해당 프로퍼티에 value를 할당합니다.

VariableDeclaration : BindingPattern Initializer
  1. rhs를 Initializer의 ? Evaluation으로 둡니다.
  2. rightValue를 ? GetValue(rhs)로 둡니다.
  3. 인수 rightValue 및 undefined를 사용한 BindingPattern의 ? BindingInitialization을 반환합니다.

14.3.3 구조 분해 바인딩 패턴

구문

BindingPattern[Yield, Await] : ObjectBindingPattern[?Yield, ?Await] ArrayBindingPattern[?Yield, ?Await] ObjectBindingPattern[Yield, Await] : { } { BindingRestProperty[?Yield, ?Await] } { BindingPropertyList[?Yield, ?Await] ,opt } { BindingPropertyList[?Yield, ?Await] , BindingRestProperty[?Yield, ?Await] } ArrayBindingPattern[Yield, Await] : [ Elisionopt BindingRestElement[?Yield, ?Await]opt ] [ BindingElementList[?Yield, ?Await] ] [ BindingElementList[?Yield, ?Await] , Elisionopt BindingRestElement[?Yield, ?Await]opt ] BindingRestProperty[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] BindingPropertyList[Yield, Await] : BindingProperty[?Yield, ?Await] BindingPropertyList[?Yield, ?Await] , BindingProperty[?Yield, ?Await] BindingElementList[Yield, Await] : BindingElisionElement[?Yield, ?Await] BindingElementList[?Yield, ?Await] , BindingElisionElement[?Yield, ?Await] BindingElisionElement[Yield, Await] : Elisionopt BindingElement[?Yield, ?Await] BindingProperty[Yield, Await] : SingleNameBinding[?Yield, ?Await] PropertyName[?Yield, ?Await] : BindingElement[?Yield, ?Await] BindingElement[Yield, Await] : SingleNameBinding[?Yield, ?Await] BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt SingleNameBinding[Yield, Await] : BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt BindingRestElement[Yield, Await] : ... BindingIdentifier[?Yield, ?Await] ... BindingPattern[?Yield, ?Await]

14.3.3.1 Runtime Semantics: PropertyBindingInitialization

구문 지향 연산 PropertyBindingInitialization. 인수 value (ECMAScript 언어 값) 및 envRecord (Environment Record 또는 undefined). 반환값: 프로퍼티 키의 List를 포함하는 정상 완료 또는 비정상 완료. 바인딩된 모든 프로퍼티 이름의 목록을 수집합니다. 다음 생성 규칙별로 정의된다.

BindingPropertyList : BindingPropertyList , BindingProperty
  1. boundNames를 인수 value 및 envRecord를 사용한 BindingPropertyList의 ? PropertyBindingInitialization으로 둡니다.
  2. nextNames를 인수 value 및 envRecord를 사용한 BindingProperty의 ? PropertyBindingInitialization으로 둡니다.
  3. boundNames와 nextNames의 목록 연결을 반환합니다.
BindingProperty : SingleNameBinding
  1. name을 SingleNameBinding의 BoundNames의 유일한 요소로 둡니다.
  2. 인수 value, envRecord 및 name을 사용한 SingleNameBinding의 ? KeyedBindingInitialization을 수행합니다.
  3. « name »을 반환합니다.
BindingProperty : PropertyName : BindingElement
  1. propertyKey를 PropertyName의 ? Evaluation으로 둡니다.
  2. 인수 value, envRecord 및 propertyKey를 사용한 BindingElement의 ? KeyedBindingInitialization을 수행합니다.
  3. « propertyKey »를 반환합니다.

14.3.3.2 Runtime Semantics: RestBindingInitialization

구문 지향 연산 RestBindingInitialization. 인수 value (ECMAScript 언어 값), envRecord (Environment Record 또는 undefined) 및 excludedNames (프로퍼티 키의 List). 반환값: unused를 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

BindingRestProperty : ... BindingIdentifier
  1. lhs를 ? ResolveBinding(BindingIdentifier의 StringValue, envRecord)으로 둡니다.
  2. restObj를 OrdinaryObjectCreate(%Object.prototype%)로 둡니다.
  3. ? CopyDataProperties(restObj, value, excludedNames)를 수행합니다.
  4. envRecord가 undefined이면 ? PutValue(lhs, restObj)를 반환합니다.
  5. ? InitializeReferencedBinding(lhs, restObj)을 반환합니다.

14.3.3.3 Runtime Semantics: KeyedBindingInitialization

구문 지향 연산 KeyedBindingInitialization. 인수 value (ECMAScript 언어 값), envRecord (Environment Record 또는 undefined) 및 propertyName (프로퍼티 키). 반환값: unused를 포함하는 정상 완료 또는 비정상 완료.

참고

envRecord에 undefined를 전달하면 초기화 값을 할당하는 데 PutValue 연산을 사용해야 함을 나타냅니다. 이는 비엄격 함수의 형식 매개변수 목록에서 발생합니다. 이 경우 같은 이름을 갖는 여러 매개변수의 가능성을 처리하기 위해 형식 매개변수 바인딩을 미리 초기화합니다.

다음 생성 규칙별로 정의된다.

BindingElement : BindingPattern Initializeropt
  1. value를 ? GetV(value, propertyName)로 설정합니다.
  2. Initializer가 존재하고 value가 undefined이면, 다음을 수행합니다.
    1. defaultValue를 Initializer의 ? Evaluation으로 둡니다.
    2. value를 ? GetValue(defaultValue)로 설정합니다.
  3. 인수 value 및 envRecord를 사용한 BindingPattern의 ? BindingInitialization을 반환합니다.
SingleNameBinding : BindingIdentifier Initializeropt
  1. name을 BindingIdentifier의 StringValue로 둡니다.
  2. lhs를 ? ResolveBinding(name, envRecord)으로 둡니다.
  3. value를 ? GetV(value, propertyName)로 설정합니다.
  4. Initializer가 존재하고 value가 undefined이면, 다음을 수행합니다.
    1. IsAnonymousFunctionDefinition(Initializer)이 true이면, 다음을 수행합니다.
      1. value를 인수 name을 사용한 Initializer의 ? NamedEvaluation으로 설정합니다.
    2. 그렇지 않으면,
      1. defaultValue를 Initializer의 ? Evaluation으로 둡니다.
      2. value를 ? GetValue(defaultValue)로 설정합니다.
  5. envRecord가 undefined이면 ? PutValue(lhs, value)를 반환합니다.
  6. ? InitializeReferencedBinding(lhs, value)를 반환합니다.

14.4 빈 문

구문

EmptyStatement : ;

14.4.1 Runtime Semantics: 평가

EmptyStatement : ;
  1. empty를 반환합니다.

14.5 표현식 문

구문

ExpressionStatement[Yield, Await] : [lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }] Expression[+In, ?Yield, ?Await] ; 참고

ExpressionStatement은 U+007B (LEFT CURLY BRACKET)로 시작할 수 없습니다. 그렇게 하면 Block과 모호해질 수 있기 때문입니다. ExpressionStatement은 function 또는 class 키워드로 시작할 수 없습니다. 그렇게 하면 FunctionDeclaration, GeneratorDeclaration 또는 ClassDeclaration과 모호해지기 때문입니다. ExpressionStatement은 async function으로 시작할 수 없습니다. 그렇게 하면 AsyncFunctionDeclaration 또는 AsyncGeneratorDeclaration과 모호해지기 때문입니다. ExpressionStatement은 두 토큰 시퀀스 let [로 시작할 수 없습니다. 그렇게 하면 첫 번째 LexicalBinding이 ArrayBindingPattern인 let LexicalDeclaration과 모호해지기 때문입니다.

14.5.1 Runtime Semantics: 평가

ExpressionStatement : Expression ;
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. ? GetValue(exprRef)를 반환합니다.

14.6 if 문

구문

IfStatement[Yield, Await, Return] : if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] else Statement[?Yield, ?Await, ?Return] if ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [lookahead ≠ else] 참고
lookahead 제한 [lookahead ≠ else]는 고전적인 “dangling else” 문제를 일반적인 방식으로 해결합니다. 즉, 연결할 if를 선택하는 것이 그 밖에는 모호할 때 else는 후보 if 중 가장 가까운(가장 안쪽의) if와 연결됩니다.

14.6.1 Static Semantics: 조기 오류

IfStatement : if ( Expression ) Statement else Statement IfStatement : if ( Expression ) Statement 참고

B.3.1에 명시된 확장을 구현한 경우에만 이 규칙을 적용할 필요가 있습니다.

14.6.2 Runtime Semantics: 평가

IfStatement : if ( Expression ) Statement else Statement
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. exprValue를 ToBoolean(? GetValue(exprRef))로 둡니다.
  3. exprValue가 true이면, 다음을 수행합니다.
    1. stmtCompletion을 Completion(첫 번째 Statement의 Evaluation)으로 둡니다.
  4. 그렇지 않으면,
    1. stmtCompletion을 Completion(두 번째 Statement의 Evaluation)으로 둡니다.
  5. ? UpdateEmpty(stmtCompletion, undefined)를 반환합니다.
IfStatement : if ( Expression ) Statement
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. exprValue를 ToBoolean(? GetValue(exprRef))로 둡니다.
  3. exprValue가 false이면 undefined를 반환합니다.
  4. stmtCompletion을 Completion(Statement의 Evaluation)으로 둡니다.
  5. ? UpdateEmpty(stmtCompletion, undefined)를 반환합니다.

14.7 반복문

구문

IterationStatement[Yield, Await, Return] : DoWhileStatement[?Yield, ?Await, ?Return] WhileStatement[?Yield, ?Await, ?Return] ForStatement[?Yield, ?Await, ?Return] ForInOfStatement[?Yield, ?Await, ?Return]

14.7.1 의미론

14.7.1.1 LoopContinues ( completion, labelSet )

추상 연산 LoopContinues. 인수 completion (Completion 레코드) 및 labelSet (String의 List). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. completion이 정상 완료이면 true를 반환합니다.
  2. completion이 continue 완료가 아니면 false를 반환합니다.
  3. completion.[[Target]]이 empty이면 true를 반환합니다.
  4. labelSet에 completion.[[Target]]이 포함되어 있으면 true를 반환합니다.
  5. false를 반환합니다.
참고

IterationStatement의 Statement 부분 안에서는 ContinueStatement을 사용하여 새로운 반복을 시작할 수 있습니다.

14.7.1.2 Runtime Semantics: LoopEvaluation

구문 지향 연산 LoopEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

IterationStatement : DoWhileStatement
  1. 인수 labelSet을 사용한 DoWhileStatement의 ? DoWhileLoopEvaluation을 반환합니다.
IterationStatement : WhileStatement
  1. 인수 labelSet을 사용한 WhileStatement의 ? WhileLoopEvaluation을 반환합니다.
IterationStatement : ForStatement
  1. 인수 labelSet을 사용한 ForStatement의 ? ForLoopEvaluation을 반환합니다.
IterationStatement : ForInOfStatement
  1. 인수 labelSet을 사용한 ForInOfStatement의 ? ForInOfLoopEvaluation을 반환합니다.

14.7.2 do-while 문

구문

DoWhileStatement[Yield, Await, Return] : do Statement[?Yield, ?Await, ?Return] while ( Expression[+In, ?Yield, ?Await] ) ;

14.7.2.1 Static Semantics: 조기 오류

DoWhileStatement : do Statement while ( Expression ) ; 참고

B.3.1에 명시된 확장을 구현한 경우에만 이 규칙을 적용할 필요가 있습니다.

14.7.2.2 Runtime Semantics: DoWhileLoopEvaluation

구문 지향 연산 DoWhileLoopEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

DoWhileStatement : do Statement while ( Expression ) ;
  1. iterationResult를 undefined로 둡니다.
  2. 다음을 반복합니다.
    1. stmtResult를 Completion(Statement의 Evaluation)으로 둡니다.
    2. LoopContinues(stmtResult, labelSet)가 false이면 ? UpdateEmpty(stmtResult, iterationResult)를 반환합니다.
    3. stmtResult.[[Value]]가 empty가 아니면 iterationResult를 stmtResult.[[Value]]로 설정합니다.
    4. exprRef를 Expression의 ? Evaluation으로 둡니다.
    5. exprValue를 ? GetValue(exprRef)로 둡니다.
    6. ToBoolean(exprValue)이 false이면 iterationResult를 반환합니다.

14.7.3 while 문

구문

WhileStatement[Yield, Await, Return] : while ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return]

14.7.3.1 Static Semantics: 조기 오류

WhileStatement : while ( Expression ) Statement 참고

B.3.1에 명시된 확장을 구현한 경우에만 이 규칙을 적용할 필요가 있습니다.

14.7.3.2 Runtime Semantics: WhileLoopEvaluation

구문 지향 연산 WhileLoopEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

WhileStatement : while ( Expression ) Statement
  1. iterationResult를 undefined로 둡니다.
  2. 다음을 반복합니다.
    1. exprRef를 Expression의 ? Evaluation으로 둡니다.
    2. exprValue를 ? GetValue(exprRef)로 둡니다.
    3. ToBoolean(exprValue)이 false이면 iterationResult를 반환합니다.
    4. stmtResult를 Completion(Statement의 Evaluation)으로 둡니다.
    5. LoopContinues(stmtResult, labelSet)가 false이면 ? UpdateEmpty(stmtResult, iterationResult)를 반환합니다.
    6. stmtResult.[[Value]]가 empty가 아니면 iterationResult를 stmtResult.[[Value]]로 설정합니다.

14.7.4 for 문

구문

ForStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] Expression[~In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( var VariableDeclarationList[~In, ?Yield, ?Await] ; Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return] for ( LexicalDeclaration[~In, ?Yield, ?Await] Expression[+In, ?Yield, ?Await]opt ; Expression[+In, ?Yield, ?Await]opt ) Statement[?Yield, ?Await, ?Return]

14.7.4.1 Static Semantics: 조기 오류

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement 참고

B.3.1에 명시된 확장을 구현한 경우에만 이 규칙을 적용할 필요가 있습니다.

ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement

14.7.4.2 Runtime Semantics: ForLoopEvaluation

구문 지향 연산 ForLoopEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. 첫 번째 Expression이 존재하면, 다음을 수행합니다.
    1. exprRef를 첫 번째 Expression의 ? Evaluation으로 둡니다.
    2. ? GetValue(exprRef)를 수행합니다.
  2. 두 번째 Expression이 존재하면 test를 두 번째 Expression로 둡니다. 그렇지 않으면 test를 empty로 둡니다.
  3. 세 번째 Expression이 존재하면 increment를 세 번째 Expression로 둡니다. 그렇지 않으면 increment를 empty로 둡니다.
  4. ? ForBodyEvaluation(test, increment, Statement, « », labelSet)을 반환합니다.
ForStatement : for ( var VariableDeclarationList ; Expressionopt ; Expressionopt ) Statement
  1. VariableDeclarationList의 ? Evaluation을 수행합니다.
  2. 첫 번째 Expression이 존재하면 test를 첫 번째 Expression로 둡니다. 그렇지 않으면 test를 empty로 둡니다.
  3. 두 번째 Expression이 존재하면 increment를 두 번째 Expression로 둡니다. 그렇지 않으면 increment를 empty로 둡니다.
  4. ? ForBodyEvaluation(test, increment, Statement, « », labelSet)을 반환합니다.
ForStatement : for ( LexicalDeclaration Expressionopt ; Expressionopt ) Statement
  1. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  2. loopEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
  3. isConst를 LexicalDeclaration의 IsConstantDeclaration으로 둡니다.
  4. boundNames를 LexicalDeclaration의 BoundNames로 둡니다.
  5. boundNames의 각 요소 name에 대해 다음을 수행합니다.
    1. isConst가 true이면, 다음을 수행합니다.
      1. ! loopEnv.CreateImmutableBinding(name, true)를 수행합니다.
    2. 그렇지 않으면,
      1. ! loopEnv.CreateMutableBinding(name, false)를 수행합니다.
  6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 loopEnv로 설정합니다.
  7. forDecl을 Completion(LexicalDeclaration의 Evaluation)으로 둡니다.
  8. forDecl이 비정상 완료이면, 다음을 수행합니다.
    1. forDecl을 Completion(DisposeResources(loopEnv.[[DisposableResourceStack]], forDecl))으로 설정합니다.
    2. 단언: forDecl은 비정상 완료입니다.
    3. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
    4. ? forDecl을 반환합니다.
  9. isConst가 false이면 perIterationLets를 boundNames로 둡니다. 그렇지 않으면 perIterationLets를 새로운 빈 List로 둡니다.
  10. 첫 번째 Expression이 존재하면 test를 첫 번째 Expression로 둡니다. 그렇지 않으면 test를 empty로 둡니다.
  11. 두 번째 Expression이 존재하면 increment를 두 번째 Expression로 둡니다. 그렇지 않으면 increment를 empty로 둡니다.
  12. bodyResult를 Completion(ForBodyEvaluation(test, increment, Statement, perIterationLets, labelSet))으로 둡니다.
  13. bodyResult를 Completion(DisposeResources(loopEnv.[[DisposableResourceStack]], bodyResult))으로 설정합니다.
  14. 단언: bodyResult가 정상 완료이면 bodyResult.[[Value]]는 empty가 아닙니다.
  15. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  16. ? bodyResult를 반환합니다.

14.7.4.3 ForBodyEvaluation ( test, increment, stmt, perIterationBindings, labelSet )

추상 연산 ForBodyEvaluation. 인수 test (Expression Parse Node 또는 empty), increment (Expression Parse Node 또는 empty), stmt (Statement Parse Node), perIterationBindings (String의 List) 및 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 호출되면 다음 단계를 수행한다.

  1. iterationResult를 undefined로 둡니다.
  2. ? CreatePerIterationEnvironment(perIterationBindings)를 수행합니다.
  3. 다음을 반복합니다.
    1. test가 empty가 아니면, 다음을 수행합니다.
      1. testRef를 test의 ? Evaluation으로 둡니다.
      2. testValue를 ? GetValue(testRef)로 둡니다.
      3. ToBoolean(testValue)이 false이면 iterationResult를 반환합니다.
    2. result를 Completion(stmt의 Evaluation)으로 둡니다.
    3. LoopContinues(result, labelSet)가 false이면 ? UpdateEmpty(result, iterationResult)를 반환합니다.
    4. result.[[Value]]가 empty가 아니면 iterationResult를 result.[[Value]]로 설정합니다.
    5. ? CreatePerIterationEnvironment(perIterationBindings)를 수행합니다.
    6. increment가 empty가 아니면, 다음을 수행합니다.
      1. incrementRef를 increment의 ? Evaluation으로 둡니다.
      2. ? GetValue(incrementRef)를 수행합니다.

14.7.4.4 CreatePerIterationEnvironment ( perIterationBindings )

추상 연산 CreatePerIterationEnvironment. 인수 perIterationBindings (String의 List). 반환값: unused를 포함하는 정상 완료 또는 throw 완료. 호출되면 다음 단계를 수행한다.

  1. perIterationBindings에 요소가 하나라도 있으면, 다음을 수행합니다.
    1. lastIterationEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
    2. outer를 lastIterationEnv.[[OuterEnv]]로 둡니다.
    3. 단언: outer는 null이 아닙니다.
    4. thisIterationEnv를 NewDeclarativeEnvironment(outer)로 둡니다.
    5. perIterationBindings의 각 요소 name에 대해 다음을 수행합니다.
      1. ! thisIterationEnv.CreateMutableBinding(name, false)를 수행합니다.
      2. lastValue를 ? lastIterationEnv.GetBindingValue(name, true)로 둡니다.
      3. ! thisIterationEnv.InitializeBinding(name, lastValue)를 수행합니다.
    6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 thisIterationEnv로 설정합니다.
  2. unused를 반환합니다.

14.7.5 for-in, for-of 및 for-await-of 문

구문

ForInOfStatement[Yield, Await, Return] : for ( [lookahead ≠ let [] LeftHandSideExpression[?Yield, ?Await] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await, +Pattern] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( ForDeclaration[?Yield, ?Await, ~Using] in Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ∉ { let, async of }] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( var ForBinding[?Yield, ?Await, +Pattern] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] for ( [lookahead ≠ using of] ForDeclaration[?Yield, ?Await, +Using] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ let] LeftHandSideExpression[?Yield, ?Await] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( var ForBinding[?Yield, ?Await, +Pattern] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] [+Await] for await ( [lookahead ≠ using of] ForDeclaration[?Yield, ?Await, +Using] of AssignmentExpression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] ForDeclaration[Yield, Await, Using] : LetOrConst ForBinding[?Yield, ?Await, +Pattern] [+Using] using [no LineTerminator here] ForBinding[?Yield, ?Await, ~Pattern] [+Using, +Await] await [no LineTerminator here] using [no LineTerminator here] ForBinding[?Yield, +Await, ~Pattern] ForBinding[Yield, Await, Pattern] : BindingIdentifier[?Yield, ?Await] [+Pattern] BindingPattern[?Yield, ?Await] 참고

이 절은 부록 B.3.5에 의해 확장됩니다.

14.7.5.1 Static Semantics: 조기 오류

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( var ForBinding in Expression ) Statement for ( ForDeclaration in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for ( var ForBinding of AssignmentExpression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( var ForBinding of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement 참고

B.3.1에 명시된 확장을 구현한 경우에만 이 규칙을 적용할 필요가 있습니다.

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement for ( LeftHandSideExpression of AssignmentExpression ) Statement for await ( LeftHandSideExpression of AssignmentExpression ) Statement ForInOfStatement : for ( ForDeclaration in Expression ) Statement for ( ForDeclaration of AssignmentExpression ) Statement for await ( ForDeclaration of AssignmentExpression ) Statement

14.7.5.2 Static Semantics: IsDestructuring

구문 지향 연산 IsDestructuring. 인수 없음. 반환값: Boolean. 다음 생성 규칙별로 정의된다.

MemberExpression : PrimaryExpression
  1. PrimaryExpression이 ObjectLiteral 또는 ArrayLiteral이면 true를 반환합니다.
  2. false를 반환합니다.
MemberExpression : MemberExpression [ Expression ] MemberExpression . IdentifierName MemberExpression TemplateLiteral SuperProperty MetaProperty new MemberExpression Arguments MemberExpression . PrivateIdentifier NewExpression : new NewExpression LeftHandSideExpression : CallExpression OptionalExpression
  1. false를 반환합니다.
ForDeclaration : LetOrConst ForBinding
  1. ForBinding의 IsDestructuring을 반환합니다.
ForBinding : BindingIdentifier
  1. false를 반환합니다.
ForBinding : BindingPattern
  1. true를 반환합니다.
참고

이 절은 부록 B.3.5에 의해 확장됩니다.

14.7.5.3 Runtime Semantics: ForDeclarationBindingInitialization

구문 지향 연산 ForDeclarationBindingInitialization. 인수 value (ECMAScript 언어 값) 및 envRecord (Environment 레코드). 반환값: unused를 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

ForDeclaration : LetOrConst ForBinding
  1. 인수 value 및 envRecord를 사용한 ForBinding의 ? BindingInitialization을 반환합니다.
ForDeclaration : using ForBinding await using ForBinding
  1. SyntaxError 예외를 던집니다.

14.7.5.4 Runtime Semantics: ForDeclarationBindingInstantiation

구문 지향 연산 ForDeclarationBindingInstantiation. 인수 envRecord (Declarative Environment 레코드). 반환값: unused. 다음 생성 규칙별로 정의된다.

ForDeclaration : LetOrConst ForBinding
  1. ForBinding의 BoundNames의 각 요소 name에 대해 다음을 수행합니다.
    1. LetOrConst의 IsConstantDeclaration이 true이면, 다음을 수행합니다.
      1. ! envRecord.CreateImmutableBinding(name, true)를 수행합니다.
    2. 그렇지 않으면,
      1. ! envRecord.CreateMutableBinding(name, false)를 수행합니다.
  2. unused를 반환합니다.
ForDeclaration : using ForBinding await using ForBinding
  1. ForBinding의 BoundNames의 각 요소 name에 대해 다음을 수행합니다.
    1. ! envRecord.CreateImmutableBinding(name, true)를 수행합니다.
  2. unused를 반환합니다.

14.7.5.5 Runtime Semantics: ForInOfLoopEvaluation

구문 지향 연산 ForInOfLoopEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

ForInOfStatement : for ( LeftHandSideExpression in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », Expression, enumerate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, enumerate, assignment, labelSet)을 반환합니다.
ForInOfStatement : for ( var ForBinding in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », Expression, enumerate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, enumerate, var-binding, labelSet)을 반환합니다.
ForInOfStatement : for ( ForDeclaration in Expression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(ForDeclaration의 BoundNames, Expression, enumerate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, enumerate, lexical-binding, labelSet)을 반환합니다.
ForInOfStatement : for ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet)을 반환합니다.
ForInOfStatement : for ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet)을 반환합니다.
ForInOfStatement : for ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(ForDeclaration의 BoundNames, AssignmentExpression, iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet)을 반환합니다.
ForInOfStatement : for await ( LeftHandSideExpression of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(LeftHandSideExpression, Statement, keyResult, iterate, assignment, labelSet, async)을 반환합니다.
ForInOfStatement : for await ( var ForBinding of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(« », AssignmentExpression, async-iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForBinding, Statement, keyResult, iterate, var-binding, labelSet, async)을 반환합니다.
ForInOfStatement : for await ( ForDeclaration of AssignmentExpression ) Statement
  1. keyResult를 ? ForIn/OfHeadEvaluation(ForDeclaration의 BoundNames, AssignmentExpression, async-iterate)으로 둡니다.
  2. ? ForIn/OfBodyEvaluation(ForDeclaration, Statement, keyResult, iterate, lexical-binding, labelSet, async)을 반환합니다.
참고

이 절은 부록 B.3.5에 의해 확장됩니다.

14.7.5.6 ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind )

추상 연산 ForIn/OfHeadEvaluation. 인수 uninitializedBoundNames (리스트 (요소: String)), expr ((an Expression Parse Node 또는 an AssignmentExpression Parse Node)) 및 iterationKind ((enumerate, iterate 또는 async-iterate)). 반환값: (정상 완료 (값: Iterator 레코드) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  2. uninitializedBoundNames가 비어 있지 않으면, 다음을 수행합니다.
    1. 단언: uninitializedBoundNames에는 중복 항목이 없습니다.
    2. newEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
    3. uninitializedBoundNames의 각 String name에 대해 다음을 수행합니다.
      1. ! newEnv.CreateMutableBinding(name, false)를 수행합니다.
    4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 newEnv로 설정합니다.
  3. exprRef를 Completion(expr의 Evaluation)으로 둡니다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  5. exprValue를 ? GetValue(? exprRef)로 둡니다.
  6. iterationKind가 enumerate이면, 다음을 수행합니다.
    1. exprValue가 undefined 또는 null이면, 다음을 수행합니다.
      1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty }를 반환합니다.
    2. obj를 ! ToObject(exprValue)로 둡니다.
    3. iterator를 EnumerateObjectProperties(obj)로 둡니다.
    4. nextMethod를 ! GetV(iterator, "next")로 둡니다.
    5. Iterator Record { [[Iterator]]: iterator, [[NextMethod]]: nextMethod, [[Done]]: false }를 반환합니다.
  7. 단언: iterationKind는 iterate 또는 async-iterate입니다.
  8. iterationKind가 async-iterate이면 iteratorKind를 async로 둡니다.
  9. 그렇지 않으면 iteratorKind를 sync로 둡니다.
  10. ? GetIterator(exprValue, iteratorKind)를 반환합니다.

14.7.5.7 ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] )

추상 연산 ForIn/OfBodyEvaluation. 인수 lhs (구문 분석 노드), stmt (a Statement Parse Node), iteratorRecord (Iterator 레코드), iterationKind ((enumerate 또는 iterate)), lhsKind ((assignment, var-binding 또는 lexical-binding)) 및 labelSet (리스트 (요소: String)) 및 선택적 인수 iteratorKind ((sync 또는 async)). 반환값: (정상 완료 (값: ECMAScript 언어 값) 또는 중도 완료). 호출되면 다음 단계를 수행한다.

  1. iteratorKind가 존재하지 않으면 iteratorKind를 sync로 설정합니다.
  2. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  3. iterationResult를 undefined로 둡니다.
  4. lhsKind가 lexical-binding이면, 다음을 수행합니다.
    1. 단언: lhs는 ForDeclaration입니다.
    2. lhs의 IsAwaitUsingDeclaration이 true이면, 다음을 수행합니다.
      1. declKind를 async-dispose로 둡니다.
    3. 그렇지 않고 lhs의 IsUsingDeclaration이 true이면, 다음을 수행합니다.
      1. declKind를 sync-dispose로 둡니다.
    4. 그렇지 않으면,
      1. declKind를 normal로 둡니다.
  5. 그렇지 않으면,
    1. declKind를 normal로 둡니다.
  6. destructuring을 lhs의 IsDestructuring으로 둡니다.
  7. destructuring이 true이고 lhsKind가 assignment이면, 다음을 수행합니다.
    1. 단언: lhs는 LeftHandSideExpression입니다.
    2. assignmentPattern을 lhs가 포괄하는 AssignmentPattern으로 둡니다.
  8. 다음을 반복합니다.
    1. nextResult를 ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]])로 둡니다.
    2. iteratorKind가 async이면 nextResult를 ? Await(nextResult)로 설정합니다.
    3. nextResult가 Object가 아니면 TypeError 예외를 던집니다.
    4. done을 ? IteratorComplete(nextResult)로 둡니다.
    5. done이 true이면 iterationResult를 반환합니다.
    6. nextValue를 ? IteratorValue(nextResult)로 둡니다.
    7. lhsKind가 assignment 또는 var-binding이면, 다음을 수행합니다.
      1. destructuring이 true이면, 다음을 수행합니다.
        1. lhsKind가 assignment이면, 다음을 수행합니다.
          1. status를 Completion(인수 nextValue를 사용한 assignmentPattern의 DestructuringAssignmentEvaluation)으로 둡니다.
        2. 그렇지 않으면,
          1. 단언: lhsKind는 var-binding입니다.
          2. 단언: lhs는 ForBinding입니다.
          3. status를 Completion(인수 nextValue 및 undefined를 사용한 lhs의 BindingInitialization)으로 둡니다.
      2. 그렇지 않으면,
        1. lhsRef를 Completion(lhs의 Evaluation)으로 둡니다. (반복해서 평가될 수 있습니다.)
        2. lhsKind가 assignment이고 lhs의 AssignmentTargetType이 web-compat이면 ReferenceError 예외를 던집니다.
        3. lhsRef가 비정상 완료이면, 다음을 수행합니다.
          1. status를 lhsRef로 둡니다.
        4. 그렇지 않으면,
          1. status를 Completion(PutValue(lhsRef.[[Value]], nextValue))으로 둡니다.
      3. iterationEnv를 undefined로 둡니다.
    8. 그렇지 않으면,
      1. 단언: lhsKind는 lexical-binding입니다.
      2. 단언: lhs는 ForDeclaration입니다.
      3. iterationEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
      4. 인수 iterationEnv를 사용한 lhs의 ForDeclarationBindingInstantiation을 수행합니다.
      5. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 iterationEnv로 설정합니다.
      6. destructuring이 true이면, 다음을 수행합니다.
        1. status를 Completion(인수 nextValue 및 iterationEnv를 사용한 lhs의 ForDeclarationBindingInitialization)으로 둡니다.
      7. 그렇지 않으면,
        1. 단언: lhs는 하나의 이름을 바인딩합니다.
        2. lhsName을 lhs의 BoundNames의 유일한 요소로 둡니다.
        3. lhsRef를 ! ResolveBinding(lhsName)으로 둡니다.
        4. declKind가 normal이 아니면, 다음을 수행합니다.
          1. 단언: IsUnresolvableReference(lhsRef)는 false입니다.
          2. base를 lhsRef.[[Base]]로 둡니다.
          3. 단언: base는 Declarative Environment Record입니다.
          4. status를 Completion(AddDisposableResource(base.[[DisposableResourceStack]], nextValue, declKind))으로 둡니다.
        5. 그렇지 않으면,
          1. status를 NormalCompletion(unused)으로 둡니다.
        6. status가 정상 완료이면, 다음을 수행합니다.
          1. status를 Completion(InitializeReferencedBinding(lhsRef, nextValue))으로 설정합니다.
    9. status가 비정상 완료이면, 다음을 수행합니다.
      1. iterationEnv가 undefined가 아니면, 다음을 수행합니다.
        1. status를 Completion(DisposeResources(iterationEnv.[[DisposableResourceStack]], status))으로 설정합니다.
        2. 단언: status는 비정상 완료입니다.
      2. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
      3. iterationKind가 enumerate이면 ? status를 반환합니다.
      4. 단언: iterationKind는 iterate입니다.
      5. iteratorKind가 async이면 ? AsyncIteratorClose(iteratorRecord, status)를 반환합니다.
      6. ? IteratorClose(iteratorRecord, status)를 반환합니다.
    10. result를 Completion(stmt의 Evaluation)으로 둡니다.
    11. iterationEnv가 undefined가 아니면, 다음을 수행합니다.
      1. result를 Completion(DisposeResources(iterationEnv.[[DisposableResourceStack]], result))으로 설정합니다.
    12. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
    13. LoopContinues(result, labelSet)가 false이면, 다음을 수행합니다.
      1. status를 Completion(UpdateEmpty(result, iterationResult))으로 설정합니다.
      2. iterationKind가 enumerate이면 ? status를 반환합니다.
      3. 단언: iterationKind는 iterate입니다.
      4. iteratorKind가 async이면 ? AsyncIteratorClose(iteratorRecord, status)를 반환합니다.
      5. ? IteratorClose(iteratorRecord, status)를 반환합니다.
    14. result.[[Value]]가 empty가 아니면 iterationResult를 result.[[Value]]로 설정합니다.

14.7.5.8 Runtime Semantics: 평가

BindingIdentifier : Identifier yield await
  1. name을 BindingIdentifier의 StringValue로 둡니다.
  2. ? ResolveBinding(name)을 반환합니다.

14.7.5.9 EnumerateObjectProperties ( obj )

추상 연산 EnumerateObjectProperties. 인수 obj (Object). 반환값: 반복자 객체. 호출되면 다음 단계를 수행한다.

  1. next 메서드가 obj의 열거 가능한 프로퍼티 중 String 값 키를 모두 순회하는 반복자 객체를 반환합니다. 반복자 객체는 ECMAScript 코드에서 절대로 직접 접근할 수 없습니다. 프로퍼티 열거의 메커니즘과 순서는 명시되지 않지만 아래에 명시된 규칙을 따라야 합니다.

반복자의 throw 및 return 메서드는 null이며 절대로 호출되지 않습니다. 반복자의 next 메서드는 객체 프로퍼티를 처리하여 해당 프로퍼티 키를 반복자 값으로 반환할지 결정합니다. 반환되는 프로퍼티 키에는 Symbol인 키가 포함되지 않습니다. 대상 객체의 프로퍼티는 열거 중에 삭제될 수 있습니다. 반복자의 next 메서드가 처리하기 전에 삭제된 프로퍼티는 무시됩니다. 열거 중 대상 객체에 새로운 프로퍼티가 추가되더라도 현재 진행 중인 열거에서 새로 추가된 프로퍼티가 처리된다는 보장은 없습니다. 어떤 프로퍼티 이름도 하나의 열거에서 반복자의 next 메서드에 의해 두 번 이상 반환되지 않습니다.

대상 객체의 프로퍼티 열거에는 해당 프로토타입, 프로토타입의 프로토타입 등의 프로퍼티를 재귀적으로 열거하는 것도 포함됩니다. 그러나 프로토타입의 프로퍼티가 반복자의 next 메서드에 의해 이미 처리된 프로퍼티와 같은 이름이면 처리하지 않습니다. 프로토타입 객체의 프로퍼티가 이미 처리되었는지를 결정할 때 [[Enumerable]] 속성 값은 고려하지 않습니다. 프로토타입 객체의 열거 가능한 프로퍼티 이름은 해당 프로토타입 객체를 인수로 전달하여 EnumerateObjectProperties를 호출해 얻어야 합니다. EnumerateObjectProperties는 대상 객체의 자체 프로퍼티 키를 [[OwnPropertyKeys]] 내부 메서드를 호출하여 얻어야 합니다. 대상 객체의 프로퍼티 속성은 [[GetOwnProperty]] 내부 메서드를 호출하여 얻어야 합니다.

또한 obj와 그 프로토타입 체인의 모든 객체가 Proxy 특수 객체, TypedArray, 모듈 네임스페이스 특수 객체 또는 구현체가 제공하는 특수 객체가 아닌 경우, 다음 중 하나가 발생하기 전까지 반복자는 CreateForInIterator(obj)가 제공하는 반복자처럼 동작해야 합니다:

  • obj 또는 그 프로토타입 체인의 객체에 있는 [[Prototype]] 내부 슬롯 값이 변경되는 경우,
  • obj 또는 그 프로토타입 체인의 객체에서 프로퍼티가 제거되는 경우,
  • obj의 프로토타입 체인의 객체에 프로퍼티가 추가되는 경우, 또는
  • obj 또는 그 프로토타입 체인의 객체에 있는 프로퍼티의 [[Enumerable]] 속성 값이 변경되는 경우.
참고 1

ECMAScript 구현체는 14.7.5.10.2.1의 알고리즘을 직접 구현할 필요가 없습니다. 앞 단락의 제약 조건 중 하나가 위반되지 않는 한 해당 알고리즘의 동작과 달라지지 않는 어떤 구현이든 선택할 수 있습니다.

다음은 이러한 규칙을 준수하는 ECMAScript 제너레이터 함수의 참고용 정의입니다:

function* EnumerateObjectProperties(obj) {
  const visited = new Set();
  for (const key of Reflect.ownKeys(obj)) {
    if (typeof key === "symbol") continue;
    const desc = Reflect.getOwnPropertyDescriptor(obj, key);
    if (desc) {
      visited.add(key);
      if (desc.enumerable) yield key;
    }
  }
  const proto = Reflect.getPrototypeOf(obj);
  if (proto === null) return;
  for (const protoKey of EnumerateObjectProperties(proto)) {
    if (!visited.has(protoKey)) yield protoKey;
  }
}
참고 2
구현체가 CreateForInIterator와 동작을 일치시킬 필요가 없는 특수 객체의 목록은 구현체들이 역사적으로 이러한 경우에는 동작이 달랐고 그 밖의 모든 경우에는 일치했기 때문에 선택되었습니다.

14.7.5.10 For-In 반복자 객체

For-In 반복자는 특정 객체에 대한 특정 반복을 나타내는 객체입니다. For-In 반복자 객체는 ECMAScript 코드에서 절대로 직접 접근할 수 없으며 EnumerateObjectProperties의 동작을 설명하기 위해서만 존재합니다.

14.7.5.10.1 CreateForInIterator ( obj )

추상 연산 CreateForInIterator. 인수 obj (Object). 반환값: For-In 반복자. obj의 자체 및 상속된 열거 가능한 문자열 프로퍼티를 특정 순서로 반복하는 For-In 반복자 객체를 생성하는 데 사용됩니다. 호출되면 다음 단계를 수행한다.

  1. iterator를 OrdinaryObjectCreate(%ForInIteratorPrototype%, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] »)로 둡니다.
  2. iterator.[[Object]]을 obj로 설정합니다.
  3. iterator.[[ObjectWasVisited]]를 false로 설정합니다.
  4. iterator.[[VisitedKeys]]를 새로운 빈 List로 설정합니다.
  5. iterator.[[RemainingKeys]]를 새로운 빈 List로 설정합니다.
  6. iterator를 반환합니다.

14.7.5.10.2 %ForInIteratorPrototype% 객체

%ForInIteratorPrototype% 객체는:

  • 모든 For-In 반복자 객체가 상속하는 프로퍼티를 갖습니다.
  • 일반 객체입니다.
  • 값이 %Iterator.prototype%인 [[Prototype]] 내부 슬롯을 갖습니다.
  • ECMAScript 코드에서 절대로 직접 접근할 수 없습니다.
  • 다음 프로퍼티를 갖습니다:

14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )

  1. iterator를 this 값으로 둡니다.
  2. 단언: iterator는 Object입니다.
  3. 단언: iterator에는 For-In 반복자 인스턴스의 모든 내부 슬롯(14.7.5.10.3)이 있습니다.
  4. obj를 iterator.[[Object]]로 둡니다.
  5. 다음을 반복합니다.
    1. iterator.[[ObjectWasVisited]]가 false이면, 다음을 수행합니다.
      1. keys를 ? obj.[[OwnPropertyKeys]]()로 둡니다.
      2. keys의 각 요소 key에 대해 다음을 수행합니다.
        1. key가 String이면, 다음을 수행합니다.
          1. key를 iterator.[[RemainingKeys]]에 추가합니다.
      3. iterator.[[ObjectWasVisited]]를 true로 설정합니다.
    2. iterator.[[RemainingKeys]]가 비어 있지 않은 동안 다음을 반복합니다.
      1. key를 iterator.[[RemainingKeys]]의 첫 번째 요소로 둡니다.
      2. iterator.[[RemainingKeys]]에서 첫 번째 요소를 제거합니다.
      3. iterator.[[VisitedKeys]]에 key가 포함되어 있지 않으면, 다음을 수행합니다.
        1. propertyDesc를 ? obj.[[GetOwnProperty]](key)로 둡니다.
        2. propertyDesc가 undefined가 아니면, 다음을 수행합니다.
          1. key를 iterator.[[VisitedKeys]]에 추가합니다.
          2. propertyDesc.[[Enumerable]]이 true이면 CreateIteratorResultObject(key, false)를 반환합니다.
    3. obj를 ? obj.[[GetPrototypeOf]]()로 설정합니다.
    4. iterator.[[Object]]을 obj로 설정합니다.
    5. iterator.[[ObjectWasVisited]]를 false로 설정합니다.
    6. obj가 null이면 CreateIteratorResultObject(undefined, true)를 반환합니다.

14.7.5.10.3 For-In 반복자 인스턴스의 프로퍼티

For-In 반복자 인스턴스는 %ForInIteratorPrototype% 내재 객체에서 프로퍼티를 상속하는 일반 객체입니다. For-In 반복자 인스턴스는 처음에 표 34에 나열된 내부 슬롯을 갖도록 생성됩니다.

표 34: For-In 반복자 인스턴스의 내부 슬롯
내부 슬롯 타입 설명
[[Object]] Object 프로퍼티를 반복 중인 Object 값입니다.
[[ObjectWasVisited]] Boolean 반복자가 [[Object]]에서 [[OwnPropertyKeys]]를 호출했으면 true, 그렇지 않으면 false입니다.
[[VisitedKeys]] String의 List 지금까지 이 반복자가 내보낸 값입니다.
[[RemainingKeys]] String의 List 프로토타입의 프로퍼티를 반복하기 전에(프로토타입이 null이 아닌 경우) 현재 객체에 대해 아직 내보내야 하는 값입니다.

14.8 continue 문

구문

ContinueStatement[Yield, Await] : continue ; continue [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.8.1 Static Semantics: 조기 오류

ContinueStatement : continue ; continue LabelIdentifier ;
  • 이 ContinueStatement이 IterationStatement 안에 직접 또는 간접적으로 중첩되어 있지 않으면(단, 함수 또는 static 초기화 블록 경계를 넘어서는 안 됩니다) Syntax Error입니다.

14.8.2 Runtime Semantics: 평가

ContinueStatement : continue ;
  1. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty }를 반환합니다.
ContinueStatement : continue LabelIdentifier ;
  1. label을 LabelIdentifier의 StringValue로 둡니다.
  2. Completion Record { [[Type]]: continue, [[Value]]: empty, [[Target]]: label }를 반환합니다.

14.9 break 문

구문

BreakStatement[Yield, Await] : break ; break [no LineTerminator here] LabelIdentifier[?Yield, ?Await] ;

14.9.1 Static Semantics: 조기 오류

BreakStatement : break ;
  • 이 BreakStatement이 IterationStatement 또는 SwitchStatement 안에 직접 또는 간접적으로 중첩되어 있지 않으면(단, 함수 또는 static 초기화 블록 경계를 넘어서는 안 됩니다) Syntax Error입니다.

14.9.2 Runtime Semantics: 평가

BreakStatement : break ;
  1. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: empty }를 반환합니다.
BreakStatement : break LabelIdentifier ;
  1. label을 LabelIdentifier의 StringValue로 둡니다.
  2. Completion Record { [[Type]]: break, [[Value]]: empty, [[Target]]: label }를 반환합니다.

14.10 return 문

구문

ReturnStatement[Yield, Await] : return ; return [no LineTerminator here] Expression[+In, ?Yield, ?Await] ; 참고

return 문은 함수 실행을 중지시키며 대부분의 경우 호출자에게 값을 반환합니다. Expression을 생략하면 반환 값은 undefined입니다. 그렇지 않으면 반환 값은 Expression의 값입니다. 주변 문맥에 따라 return 문이 실제로 호출자에게 값을 반환하지 않을 수도 있습니다. 예를 들어 try 블록에서 return 문의 Completion Record는 finally 블록을 평가하는 동안 다른 Completion Record로 교체될 수 있습니다.

14.10.1 Runtime Semantics: 평가

ReturnStatement : return ;
  1. ReturnCompletion(undefined)을 반환합니다.
ReturnStatement : return Expression ;
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. exprValue를 ? GetValue(exprRef)로 둡니다.
  3. GetGeneratorKind()가 async이면 exprValue를 ? Await(exprValue)로 설정합니다.
  4. ReturnCompletion(exprValue)을 반환합니다.

14.11 with 문

참고 1

새로운 ECMAScript 코드에서는 레거시 with 문의 사용을 권장하지 않습니다. 구조 분해 할당과 같이 엄격 모드 코드와 비엄격 코드 모두에서 허용되는 대안을 고려하시기 바랍니다.

구문

WithStatement[Yield, Await, Return] : with ( Expression[+In, ?Yield, ?Await] ) Statement[?Yield, ?Await, ?Return] 참고 2

with 문은 계산된 객체에 대한 Object Environment Record를 실행 중인 실행 컨텍스트의 렉시컬 환경에 추가합니다. 그런 다음 이 확장된 렉시컬 환경을 사용하여 문을 실행합니다. 마지막으로 원래 렉시컬 환경을 복원합니다.

14.11.1 Static Semantics: 조기 오류

WithStatement : with ( Expression ) Statement 참고

B.3.1에 명시된 확장을 구현한 경우에만 두 번째 규칙을 적용할 필요가 있습니다.

14.11.2 Runtime Semantics: 평가

WithStatement : with ( Expression ) Statement
  1. value를 Expression의 ? Evaluation으로 둡니다.
  2. obj를 ? ToObject(? GetValue(value))로 둡니다.
  3. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  4. newEnv를 NewObjectEnvironment(obj, true, oldEnv)로 둡니다.
  5. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 newEnv로 설정합니다.
  6. stmtCompletion을 Completion(Statement의 Evaluation)으로 둡니다.
  7. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  8. ? UpdateEmpty(stmtCompletion, undefined)를 반환합니다.
참고

제어가 포함된 Statement을 정상적으로 벗어나든 어떤 형태의 비정상 완료 또는 예외로 벗어나든 LexicalEnvironment는 항상 이전 상태로 복원됩니다.

14.12 switch 문

구문

SwitchStatement[Yield, Await, Return] : switch ( Expression[+In, ?Yield, ?Await] ) CaseBlock[?Yield, ?Await, ?Return] CaseBlock[Yield, Await, Return] : { CaseClauses[?Yield, ?Await, ?Return]opt } { CaseClauses[?Yield, ?Await, ?Return]opt DefaultClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return]opt } CaseClauses[Yield, Await, Return] : CaseClause[?Yield, ?Await, ?Return] CaseClauses[?Yield, ?Await, ?Return] CaseClause[?Yield, ?Await, ?Return] CaseClause[Yield, Await, Return] : case Expression[+In, ?Yield, ?Await] : StatementList[?Yield, ?Await, ?Return]opt DefaultClause[Yield, Await, Return] : default : StatementList[?Yield, ?Await, ?Return]opt

14.12.1 Static Semantics: 조기 오류

SwitchStatement : switch ( Expression ) CaseBlock CaseClause : case Expression : StatementList DefaultClause : default : StatementList

14.12.2 Runtime Semantics: CaseBlockEvaluation

구문 지향 연산 CaseBlockEvaluation. 인수 input (ECMAScript 언어 값). 반환값: ECMAScript 언어 값을 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

CaseBlock : { }
  1. undefined를 반환합니다.
CaseBlock : { CaseClauses }
  1. resultValue를 undefined로 둡니다.
  2. caseClauses를 소스 텍스트 순서로 된 CaseClauses의 CaseClause 항목 List로 둡니다.
  3. found를 false로 둡니다.
  4. caseClauses의 각 CaseClause clause에 대해 다음을 수행합니다.
    1. found가 false이면, 다음을 수행합니다.
      1. found를 ? CaseClauseIsSelected(clause, input)로 설정합니다.
    2. found가 true이면, 다음을 수행합니다.
      1. completion을 Completion(clause의 Evaluation)으로 둡니다.
      2. completion.[[Value]]가 empty가 아니면 resultValue를 completion.[[Value]]로 설정합니다.
      3. completion이 비정상 완료이면 ? UpdateEmpty(completion, resultValue)를 반환합니다.
  5. resultValue를 반환합니다.
CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt }
  1. resultValue를 undefined로 둡니다.
  2. 첫 번째 CaseClauses가 존재하면, 다음을 수행합니다.
    1. caseClauses를 소스 텍스트 순서로 된 첫 번째 CaseClauses의 CaseClause 항목 List로 둡니다.
  3. 그렇지 않으면,
    1. caseClauses를 새로운 빈 List로 둡니다.
  4. found를 false로 둡니다.
  5. caseClauses의 각 CaseClause clause에 대해 다음을 수행합니다.
    1. found가 false이면, 다음을 수행합니다.
      1. found를 ? CaseClauseIsSelected(clause, input)로 설정합니다.
    2. found가 true이면, 다음을 수행합니다.
      1. completion을 Completion(clause의 Evaluation)으로 둡니다.
      2. completion.[[Value]]가 empty가 아니면 resultValue를 completion.[[Value]]로 설정합니다.
      3. completion이 비정상 완료이면 ? UpdateEmpty(completion, resultValue)를 반환합니다.
  6. foundInB를 false로 둡니다.
  7. 두 번째 CaseClauses가 존재하면, 다음을 수행합니다.
    1. secondCaseClauses를 소스 텍스트 순서로 된 두 번째 CaseClauses의 CaseClause 항목 List로 둡니다.
  8. 그렇지 않으면,
    1. secondCaseClauses를 새로운 빈 List로 둡니다.
  9. found가 false이면, 다음을 수행합니다.
    1. secondCaseClauses의 각 CaseClause clause에 대해 다음을 수행합니다.
      1. foundInB가 false이면, 다음을 수행합니다.
        1. foundInB를 ? CaseClauseIsSelected(clause, input)로 설정합니다.
      2. foundInB가 true이면, 다음을 수행합니다.
        1. completion을 Completion(CaseClause clause의 Evaluation)으로 둡니다.
        2. completion.[[Value]]가 empty가 아니면 resultValue를 completion.[[Value]]로 설정합니다.
        3. completion이 비정상 완료이면 ? UpdateEmpty(completion, resultValue)를 반환합니다.
  10. foundInB가 true이면 resultValue를 반환합니다.
  11. defaultR을 Completion(DefaultClause의 Evaluation)으로 둡니다.
  12. defaultR.[[Value]]가 empty가 아니면 resultValue를 defaultR.[[Value]]로 설정합니다.
  13. defaultR이 비정상 완료이면 ? UpdateEmpty(defaultR, resultValue)를 반환합니다.
  14. 참고: 다음은 두 번째 CaseClauses를 다시 완전히 반복하는 것입니다.
  15. secondCaseClauses의 각 CaseClause clause에 대해 다음을 수행합니다.
    1. completion을 Completion(CaseClause clause의 Evaluation)으로 둡니다.
    2. completion.[[Value]]가 empty가 아니면 resultValue를 completion.[[Value]]로 설정합니다.
    3. completion이 비정상 완료이면 ? UpdateEmpty(completion, resultValue)를 반환합니다.
  16. resultValue를 반환합니다.

14.12.3 CaseClauseIsSelected ( caseClauseNode, input )

추상 연산 CaseClauseIsSelected. 인수 caseClauseNode (CaseClause Parse Node) 및 input (ECMAScript 언어 값). 반환값: Boolean을 포함하는 정상 완료 또는 비정상 완료. caseClauseNode가 input과 일치하는지 결정합니다. 호출되면 다음 단계를 수행한다.

  1. 단언: caseClauseNode는 생성 규칙 CaseClause : case Expression : StatementListopt 의 인스턴스입니다.
  2. exprRef를 caseClauseNode의 Expression의 ? Evaluation으로 둡니다.
  3. clauseSelector를 ? GetValue(exprRef)로 둡니다.
  4. IsStrictlyEqual(input, clauseSelector)을 반환합니다.
참고

이 연산은 caseClauseNode의 StatementList(있는 경우)를 실행하지 않습니다. CaseBlock 알고리즘은 이 연산의 반환 값을 사용하여 어느 StatementList부터 실행을 시작할지 결정합니다.

14.12.4 Runtime Semantics: 평가

SwitchStatement : switch ( Expression ) CaseBlock
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. switchValue를 ? GetValue(exprRef)로 둡니다.
  3. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  4. blockEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
  5. BlockDeclarationInstantiation(CaseBlock, blockEnv)을 수행합니다.
  6. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 blockEnv로 설정합니다.
  7. blockResult를 Completion(인수 switchValue를 사용한 CaseBlock의 CaseBlockEvaluation)으로 둡니다.
  8. 단언: blockEnv.[[DisposableResourceStack]]은 빈 List입니다.
  9. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  10. blockResult를 반환합니다.
참고

제어가 어떤 방식으로 SwitchStatement을 벗어나더라도 LexicalEnvironment는 항상 이전 상태로 복원됩니다.

CaseClause : case Expression :
  1. empty를 반환합니다.
CaseClause : case Expression : StatementList
  1. StatementList의 ? Evaluation을 반환합니다.
DefaultClause : default :
  1. empty를 반환합니다.
DefaultClause : default : StatementList
  1. StatementList의 ? Evaluation을 반환합니다.

14.13 레이블 문

구문

LabelledStatement[Yield, Await, Return] : LabelIdentifier[?Yield, ?Await] : LabelledItem[?Yield, ?Await, ?Return] LabelledItem[Yield, Await, Return] : Statement[?Yield, ?Await, ?Return] FunctionDeclaration[?Yield, ?Await, ~Default] 참고

Statement 앞에는 레이블을 붙일 수 있습니다. 레이블 문은 레이블이 있는 break 및 continue 문과 함께 사용하는 경우에만 사용됩니다. ECMAScript에는 goto 문이 없습니다. Statement은 LabelledStatement의 일부가 될 수 있고, 해당 LabelledStatement 자체도 다시 LabelledStatement의 일부가 될 수 있으며 이런 식으로 계속될 수 있습니다. 이 방식으로 도입된 레이블은 개별 문의 의미론을 설명할 때 통틀어 “현재 레이블 집합”이라고 합니다.

14.13.1 Static Semantics: 조기 오류

LabelledItem : FunctionDeclaration

14.13.2 Static Semantics: IsLabelledFunction ( stmt )

추상 연산 IsLabelledFunction. 인수 stmt (Statement Parse Node). 반환값: Boolean. 호출되면 다음 단계를 수행한다.

  1. stmt가 LabelledStatement이 아니면 false를 반환합니다.
  2. item을 stmt의 LabelledItem으로 둡니다.
  3. item이 LabelledItem : FunctionDeclaration 이면 true를 반환합니다.
  4. subStmt를 item의 Statement으로 둡니다.
  5. IsLabelledFunction(subStmt)을 반환합니다.

14.13.3 Runtime Semantics: 평가

LabelledStatement : LabelIdentifier : LabelledItem
  1. 인수 « »을 사용한 이 LabelledStatement의 ? LabelledEvaluation을 반환합니다.

14.13.4 Runtime Semantics: LabelledEvaluation

구문 지향 연산 LabelledEvaluation. 인수 labelSet (String의 List). 반환값: ECMAScript 언어 값 또는 empty를 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

BreakableStatement : IterationStatement
  1. stmtResult를 Completion(인수 labelSet을 사용한 IterationStatement의 LoopEvaluation)으로 둡니다.
  2. stmtResult가 break 완료이면, 다음을 수행합니다.
    1. stmtResult.[[Target]]이 empty이면, 다음을 수행합니다.
      1. stmtResult.[[Value]]가 empty이면 stmtResult를 NormalCompletion(undefined)으로 설정합니다.
      2. 그렇지 않으면 stmtResult를 NormalCompletion(stmtResult.[[Value]])으로 설정합니다.
  3. ? stmtResult를 반환합니다.
BreakableStatement : SwitchStatement
  1. stmtResult를 Completion(SwitchStatement의 Evaluation)으로 둡니다.
  2. stmtResult가 break 완료이면, 다음을 수행합니다.
    1. stmtResult.[[Target]]이 empty이면, 다음을 수행합니다.
      1. stmtResult.[[Value]]가 empty이면 stmtResult를 NormalCompletion(undefined)으로 설정합니다.
      2. 그렇지 않으면 stmtResult를 NormalCompletion(stmtResult.[[Value]])으로 설정합니다.
  3. ? stmtResult를 반환합니다.
참고 1

BreakableStatement은 레이블 없는 BreakStatement을 통해 빠져나올 수 있는 문입니다.

LabelledStatement : LabelIdentifier : LabelledItem
  1. label을 LabelIdentifier의 StringValue로 둡니다.
  2. newLabelSet을 labelSet과 « label »의 목록 연결로 둡니다.
  3. stmtResult를 Completion(인수 newLabelSet을 사용한 LabelledItem의 LabelledEvaluation)으로 둡니다.
  4. stmtResult가 break 완료이고 stmtResult.[[Target]]이 label이면, 다음을 수행합니다.
    1. stmtResult를 NormalCompletion(stmtResult.[[Value]])으로 설정합니다.
  5. ? stmtResult를 반환합니다.
LabelledItem : FunctionDeclaration
  1. FunctionDeclaration의 ? Evaluation을 반환합니다.
Statement : BlockStatement VariableStatement EmptyStatement ExpressionStatement IfStatement ContinueStatement BreakStatement ReturnStatement WithStatement ThrowStatement TryStatement DebuggerStatement
  1. Statement의 ? Evaluation을 반환합니다.
참고 2

LabelledEvaluation에 특별한 의미론을 갖는 Statement의 생성 규칙은 BreakableStatement과 LabelledStatement 두 가지뿐입니다.

14.14 throw 문

구문

ThrowStatement[Yield, Await] : throw [no LineTerminator here] Expression[+In, ?Yield, ?Await] ;

14.14.1 Runtime Semantics: 평가

ThrowStatement : throw Expression ;
  1. exprRef를 Expression의 ? Evaluation으로 둡니다.
  2. exprValue를 ? GetValue(exprRef)로 둡니다.
  3. exprValue를 던집니다.

14.15 try 문

구문

TryStatement[Yield, Await, Return] : try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] try Block[?Yield, ?Await, ?Return] Catch[?Yield, ?Await, ?Return] Finally[?Yield, ?Await, ?Return] Catch[Yield, Await, Return] : catch ( CatchParameter[?Yield, ?Await] ) Block[?Yield, ?Await, ?Return] catch Block[?Yield, ?Await, ?Return] Finally[Yield, Await, Return] : finally Block[?Yield, ?Await, ?Return] CatchParameter[Yield, Await] : BindingIdentifier[?Yield, ?Await] BindingPattern[?Yield, ?Await] 참고

try 문은 런타임 오류 또는 throw 문과 같은 예외 상황이 발생할 수 있는 코드 블록을 둘러쌉니다. catch 절은 예외 처리 코드를 제공합니다. catch 절이 예외를 포착하면 해당 CatchParameter는 그 예외에 바인딩됩니다.

14.15.1 Static Semantics: 조기 오류

Catch : catch ( CatchParameter ) Block

14.15.2 Runtime Semantics: CatchClauseEvaluation

구문 지향 연산 CatchClauseEvaluation. 인수 thrownValue (ECMAScript 언어 값). 반환값: ECMAScript 언어 값 또는 empty를 포함하는 정상 완료 또는 비정상 완료. 다음 생성 규칙별로 정의된다.

Catch : catch ( CatchParameter ) Block
  1. oldEnv를 실행 중인 실행 컨텍스트의 LexicalEnvironment로 둡니다.
  2. catchEnv를 NewDeclarativeEnvironment(oldEnv)로 둡니다.
  3. CatchParameter의 BoundNames의 각 요소 argName에 대해 다음을 수행합니다.
    1. ! catchEnv.CreateMutableBinding(argName, false)를 수행합니다.
  4. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 catchEnv로 설정합니다.
  5. status를 Completion(인수 thrownValue 및 catchEnv를 사용한 CatchParameter의 BindingInitialization)으로 둡니다.
  6. status가 비정상 완료이면, 다음을 수행합니다.
    1. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
    2. ? status를 반환합니다.
  7. blockCompletion을 Completion(Block의 Evaluation)으로 둡니다.
  8. 실행 중인 실행 컨텍스트의 LexicalEnvironment를 oldEnv로 설정합니다.
  9. ? blockCompletion을 반환합니다.
Catch : catch Block
  1. Block의 ? Evaluation을 반환합니다.
참고

제어가 어떤 방식으로 Block을 벗어나더라도 LexicalEnvironment는 항상 이전 상태로 복원됩니다.

14.15.3 Runtime Semantics: 평가

TryStatement : try Block Catch
  1. blockResult를 Completion(Block의 Evaluation)으로 둡니다.
  2. blockResult가 throw 완료이면 catchResult를 Completion(인수 blockResult.[[Value]]를 사용한 Catch의 CatchClauseEvaluation)으로 둡니다.
  3. 그렇지 않으면 catchResult를 blockResult로 둡니다.
  4. ? UpdateEmpty(catchResult, undefined)를 반환합니다.
TryStatement : try Block Finally
  1. blockResult를 Completion(Block의 Evaluation)으로 둡니다.
  2. finallyResult를 Completion(Finally의 Evaluation)으로 둡니다.
  3. finallyResult가 정상 완료이면 finallyResult를 blockResult로 설정합니다.
  4. ? UpdateEmpty(finallyResult, undefined)를 반환합니다.
TryStatement : try Block Catch Finally
  1. blockResult를 Completion(Block의 Evaluation)으로 둡니다.
  2. blockResult가 throw 완료이면 catchResult를 Completion(인수 blockResult.[[Value]]를 사용한 Catch의 CatchClauseEvaluation)으로 둡니다.
  3. 그렇지 않으면 catchResult를 blockResult로 둡니다.
  4. finallyResult를 Completion(Finally의 Evaluation)으로 둡니다.
  5. finallyResult가 정상 완료이면 finallyResult를 catchResult로 설정합니다.
  6. ? UpdateEmpty(finallyResult, undefined)를 반환합니다.

14.16 debugger 문

구문

DebuggerStatement : debugger ;

14.16.1 Runtime Semantics: 평가

참고

DebuggerStatement을 평가하면 디버거에서 실행할 때 구현체가 중단점을 발생시킬 수 있습니다. 디버거가 없거나 활성 상태가 아니면 이 문은 관찰 가능한 효과가 없습니다.

DebuggerStatement : debugger ;
  1. 구현체 정의 디버깅 기능을 사용할 수 있고 활성화되어 있으면, 다음을 수행합니다.
    1. 구현체 정의 디버깅 동작을 수행합니다.
    2. 새로운 구현체 정의 Completion Record를 반환합니다.
  2. empty를 반환합니다.