構文:
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
HoistableDeclaration[?Yield, ?Await, ~Default]
ClassDeclaration[?Yield, ?Await, ~Default]
LexicalDeclaration[+In, ?Yield, ?Await]
FunctionDeclaration[?Yield, ?Await, ?Default]
GeneratorDeclaration[?Yield, ?Await, ?Default]
AsyncFunctionDeclaration[?Yield, ?Await, ?Default]
AsyncGeneratorDeclaration[?Yield, ?Await, ?Default]
IterationStatement[?Yield, ?Await, ?Return]
SwitchStatement[?Yield, ?Await, ?Return]
13.1 ステートメントセマンティクス(Statement Semantics)
13.1.1 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
- false を返す
13.1.2 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
VariableStatement
EmptyStatement
ExpressionStatement
ContinueStatement
ReturnStatement
ThrowStatement
DebuggerStatement
- false を返す
13.1.3 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
VariableStatement
EmptyStatement
ExpressionStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
- false を返す
- labelSet のすべての要素が追加された iterationSet のコピーを newIterationSet とする
- 引数 newIterationSet と « » を使用して IterationStatement の ContainsUndefinedContinueTarget を返す
13.1.4 静的セマンティクス(Static Semantics): DeclarationPart
- ClassDeclaration を返す
13.1.5 静的セマンティクス(Static Semantics): VarDeclaredNames
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
- 空の新規List を返す
13.1.6 静的セマンティクス(Static Semantics): VarScopedDeclarations
EmptyStatement
ExpressionStatement
ContinueStatement
BreakStatement
ReturnStatement
ThrowStatement
DebuggerStatement
- 空の新規List を返す
13.1.7 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- 引数 labelSet を使用して IterationStatement の LabelledEvaluation を stmtResult とする
- stmtResult.[[Type]] が break なら、
- stmtResult.[[Target]] が empty なら、
- stmtResult.[[Value]] が empty なら、NormalCompletion(undefined) を stmtResult にセットする
- 異なるなら、NormalCompletion(stmtResult.[[Value]]) を stmtResult にセットする
- stmtResult.[[Target]] が empty なら、
- Completion(stmtResult) を返す
- SwitchStatement の評価結果を stmtResult とする
- stmtResult.[[Type]] が break なら、
- stmtResult.[[Target]] が empty なら、
- stmtResult.[[Value]] が empty なら、NormalCompletion(undefined) を stmtResult にセット
- 異なるなら、 NormalCompletion(stmtResult.[[Value]]) を stmtResult にセットする
- stmtResult.[[Target]] が empty なら、
- Completion(stmtResult) を返す
13.1.8 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- NormalCompletion(empty) を返す
- FunctionDeclaration の評価結果を返す
- 空の新規List を newLabelSet とする
- 引数 newLabelSet を使用して BreakableStatement の LabelledEvaluation の実行結果 を返す
13.2 ブロック(Block)
構文:
StatementListItem[?Yield, ?Await, ?Return]
StatementList[?Yield, ?Await, ?Return] StatementListItem[?Yield, ?Await, ?Return]
Statement[?Yield, ?Await, ?Return]
Declaration[?Yield, ?Await]
13.2.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- StatementList の LexicallyDeclaredNames に重複するエントリが含まれている場合、構文エラーです。
- StatementListのLexicallyDeclaredNamesの要素がStatementListのVarDeclaredNamesにもある場合は、構文エラーです。
13.2.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- false を返す
- 引数 labelSet を使用して StatementList の ContainsDuplicateLabels を hasDuplicates とする
- hasDuplicates が true なら、 true を返す
- 引数 labelSet を使用して StatementListItem の ContainsDuplicateLabels の実行結果を返す
- false を返す
13.2.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- false を返す
- 引数 labelSet を使用して StatementList の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 labelSet を使用して StatementListItem の ContainsUndefinedBreakTarget の実行結果を返す
- false を返す
13.2.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
- false を返す
- 引数 iterationSet と « » を使用して StatementList の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 iterationSet と « » を使用して StatementListItem の ContainsUndefinedContinueTarget の実行結果を返す
- false を返す
13.2.5 静的セマンティクス(Static Semantics): LexicallyDeclaredNames
- 空の新規List を返す
- StatementList の LexicallyDeclaredNames を names とする
- StatementListItem の LexicallyDeclaredNames の要素を names に追加する
- names を返す
- Statement が Statement : LabelledStatement なら、LabelledStatement の LexicallyDeclaredNames を返す
- 空の新規リストを返す
- Declaration の BoundNames を返す
13.2.6 静的セマンティクス(Static Semantics): LexicallyScopedDeclarations
- StatementList の LexicallyScopedDeclarations を declarations とする
- StatementListItem の LexicallyScopedDeclarations の要素を declarations に追加する
- declarations を返す
- Statement が Statement : LabelledStatement なら、 LabelledStatement の LexicallyScopedDeclarations を返す
- 空の新規List を返す
- Declaration の DeclarationPart を含む新規List を返す
13.2.7 静的セマンティクス(Static Semantics): TopLevelLexicallyDeclaredNames
- StatementList の TopLevelLexicallyDeclaredNames を names とする
- StatementListItem の TopLevelLexicallyDeclaredNames の要素を names に追加する
- names を返す
- 空の新規List を返す
- Declaration が Declaration : HoistableDeclaration なら、
- Declaration の BoundNames を返す
13.2.8 静的セマンティクス(Static Semantics): TopLevelLexicallyScopedDeclarations
- 空の新規List を返す
- StatementList の TopLevelLexicallyScopedDeclarations を declarations とする
- StatementListItem の TopLevelLexicallyScopedDeclarations の要素を declarations に追加する
- declarations を返す
- 空の新規List を返す
- Declaration が Declaration : HoistableDeclaration なら、
- Declaration を含む新規List を返す
13.2.9 静的セマンティクス(Static Semantics): TopLevelVarDeclaredNames
- 空の新規List を返す
- StatementList の TopLevelVarDeclaredNames を names とする
- StatementListItem の TopLevelVarDeclaredNames の要素を names に追加する
- names を返す
- Declaration が Declaration : HoistableDeclaration なら、
- HoistableDeclaration の BoundNames を返す
- 空の新規List を返す
- Statement が Statement : LabelledStatement なら、Statement の TopLevelVarDeclaredNames を返す
- Statement の VarDeclaredNames を返す
13.2.10 静的セマンティクス(Static Semantics): TopLevelVarScopedDeclarations
- 空の新規List を返す
- StatementList の TopLevelVarScopedDeclarations を declarations とする
- StatementListItem の TopLevelVarScopedDeclarations の要素を declarations に追加する
- declarations を返す
- Statement が Statement : LabelledStatement なら、 Statement の TopLevelVarScopedDeclarations を返す
- Statement の VarScopedDeclarations を返す
- Declaration が Declaration : HoistableDeclaration なら、
- HoistableDeclaration の DeclarationPart を declaration とする
- « declaration » を返す
- 空の新規List を返す
13.2.11 静的セマンティクス(Static Semantics): VarDeclaredNames
- 空の新規List を返す
- StatementList の VarDeclaredNames を names とする
- StatementListItem の VarDeclaredNames の要素を names に追加する
- names を返す
- 空の新規List を返す
13.2.12 静的セマンティクス(Static Semantics): VarScopedDeclarations
- 空の新規List を返す
- StatementList の VarScopedDeclarations を declarations とする
- StatementListItem の VarScopedDeclarations の要素を declarations に追加する
- declarations を返す
- 空の新規List を返す
13.2.13 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- NormalCompletion(empty) を返す
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- NewDeclarativeEnvironment(oldEnv) を blockEnv とする
- BlockDeclarationInstantiation(StatementList , blockEnv) を実行する
- blockEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- StatementList の評価結果を blockValue とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- blockValue を返す
- StatementList の評価結果を sl とする
- ReturnIfAbrupt(sl)
- StatementListItem の評価結果を s とする
- Completion(UpdateEmpty(s, sl)) を返す
StatementListの値は、StatementListの値を生成する最後の項目の値です。 たとえば、次のeval関数の呼び出しはすべて値1を返します。
eval("1;;;;;")
eval("1;{}")
eval("1;var a;")
13.2.14 ランタイムセマンティクス(Runtime Semantics): BlockDeclarationInstantiation ( code, env )
BlockDeclarationInstantiationは、引数codeとenvを使用して次のように実行されます。 codeは、ブロックの本体に対応するパースノードです。 envは、バインディングが作成されるレキシカル環境です。
- env の EnvironmentRecord を envRec とする
- Assert: envRec は 宣言型環境レコード
- code の LexicallyScopedDeclarations を declarations とする
- declarations の 各要素を d とし、d ごとに次を実行する
- d の BoundNames の 各要素を dn とし、dn ごとに次を実行する
- d が FunctionDeclaration 、 GeneratorDeclaration 、 AsyncFunctionDeclaration 、 AsyncGeneratorDeclaration のどれかなら、
- d の BoundNames の唯一の要素を fn とする
- 引数 env を使用して d の InstantiateFunctionObject を fo とする
- envRec.InitializeBinding(fn, fo) を実行する
13.3 宣言と変数ステートメント(Declarations and the Variable Statement)
13.3.1 LetとConst宣言(Let and Const Declarations)
let a = 1; などのコードに到達時に、値が割り当てられる。
構文:
LexicalBinding[?In, ?Yield, ?Await]
BindingList[?In, ?Yield, ?Await] ,LexicalBinding[?In, ?Yield, ?Await]
BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
13.3.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- BindingList の BoundNames が "let" を含む場合、構文エラーです
- BindingList の BoundNames に重複するエントリが含まれている場合、構文エラーです
- Initializerが存在せず、LexicalBinding を含む LexicalDeclaration の IsConstantDeclaration が true の場合、構文エラーです
13.3.1.2 静的セマンティクス(Static Semantics): BoundNames
- BindingList の BoundNames を返す
- BindingList の the BoundNames を names とする
- LexicalBinding の BoundNames の要素を names に追加する
- names を返す
- BindingIdentifier の BoundNames を返す
- BindingPattern の the BoundNames を返す
13.3.1.3 静的セマンティクス(Static Semantics): IsConstantDeclaration
- LetOrConst の IsConstantDeclaration を返す
- false を返す
- true を返す
13.3.1.4 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- BindingList の評価結果を next とする
- ReturnIfAbrupt(next)
- NormalCompletion(empty) を返す
- BindingList の評価結果を next とする
- ReturnIfAbrupt(next)
- LexicalBinding の 評価結果を返す
- ResolveBinding(BindingIdentifier の StringValue )を lhs とする
- InitializeReferencedBinding(lhs, undefined) を返す
- BindingIdentifier の StringValue を bindingId とする
- ResolveBinding(bindingId) を lhs とする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 bindingId を使用して Initializer の NamedEvaluation を value とする
- 3. でないなら、
- Initializer の評価結果を rhs とする
- ? GetValue(rhs) を value とする
- InitializeReferencedBinding(lhs, value) を返す
- Initializer の評価結果を rhs とする
- ? GetValue(rhs) を value とする
- 実行中の実行コンテキスト の LexicalEnvironment を env とする
- 引数 value と env を使用して BindingPattern の BindingInitialization の実行結果を返す
13.3.2 変数ステートメント(Variable Statement)
var a = 1; などのコードに到達時に、実際の値が割り当てられる。
構文:
VariableDeclaration[?In, ?Yield, ?Await]
VariableDeclarationList[?In, ?Yield, ?Await] ,VariableDeclaration[?In, ?Yield, ?Await]
BindingIdentifier[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]opt
BindingPattern[?Yield, ?Await] Initializer[?In, ?Yield, ?Await]
13.3.2.1 静的セマンティクス(Static Semantics): BoundNames
- VariableDeclarationList の BoundNames を names とする
- VariableDeclaration の BoundNames の要素を names に追加する
- names を返す
- BindingIdentifier の the BoundNames を返す
- BindingPattern の BoundNames を返す
13.3.2.2 静的セマンティクス(Static Semantics): VarDeclaredNames
- VariableDeclarationList の BoundNames を返す
13.3.2.3 静的セマンティクス(Static Semantics): VarScopedDeclarations
- VariableDeclaration を含む新規List を返す
-
- VariableDeclarationList の VarScopedDeclarations を declarations とする
- declarations に VariableDeclaration を追加する<
- declarations を返す
13.3.2.4 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- VariableDeclarationList の評価結果を next とする
- ReturnIfAbrupt(next)
- NormalCompletion(empty) を返す
- VariableDeclarationList の評価結果を next とする
- ReturnIfAbrupt(next)
- VariableDeclaration の 評価結果を返す
- NormalCompletion(empty) を返す
- BindingIdentifier の StringValue を bindingId とする
- ? ResolveBinding(bindingId) を lhs とする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 bindingId を使用して Initializer の NamedEvaluation を value とする
- 3. でないなら、
- Initializer の評価結果を rhs とする
- ? GetValue(rhs) を value とする
- ? PutValue(lhs, value) を返す
- Initializer の評価結果を rhs とする
- ? GetValue(rhs) を rval とする
- 引数 rval と undefined を使用して BindingPattern の BindingInitialization の実行結果を返す
13.3.3 バインディングの分割パターン(Destructuring Binding Patterns)
構文:
ObjectBindingPattern[?Yield, ?Await]
ArrayBindingPattern[?Yield, ?Await]
{}
{BindingRestProperty[?Yield, ?Await] }
{BindingPropertyList[?Yield, ?Await] }
{BindingPropertyList[?Yield, ?Await] ,BindingRestProperty[?Yield, ?Await]opt }
[Elisionopt BindingRestElement[?Yield, ?Await]opt ]
[BindingElementList[?Yield, ?Await] ]
[BindingElementList[?Yield, ?Await] ,Elisionopt BindingRestElement[?Yield, ?Await]opt ]
BindingProperty[?Yield, ?Await]
BindingPropertyList[?Yield, ?Await] ,BindingProperty[?Yield, ?Await]
BindingElisionElement[?Yield, ?Await]
BindingElementList[?Yield, ?Await] ,BindingElisionElement[?Yield, ?Await]
SingleNameBinding[?Yield, ?Await]
PropertyName[?Yield, ?Await] :BindingElement[?Yield, ?Await]
SingleNameBinding[?Yield, ?Await]
BindingPattern[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
BindingIdentifier[?Yield, ?Await] Initializer[+In, ?Yield, ?Await]opt
...BindingIdentifier[?Yield, ?Await]
...BindingPattern[?Yield, ?Await]
13.3.3.1 静的セマンティクス(Static Semantics): BoundNames
- 空の新規List を返す
- BindingPropertyList の BoundNames を names とする
- BindingRestProperty の BoundNames の要素を names に追加する
- names を返す
- 空の新規List を返す
- BindingRestElement の BoundNames を返す
- BindingElementList の BoundNames を返す
- BindingElementList の BoundNames を names とする
- BindingRestElement の BoundNames の要素を names に追加する
- names を返す
- BindingPropertyList の BoundNames を names とする
- BindingProperty の BoundNames の要素を names に追加する
- names を返す
- BindingElementList の BoundNames を names とする
- BindingElisionElement の BoundNames の要素を names に追加する
- names を返す
- BindingElement の BoundNames を返す
- BindingElement の BoundNames を返す
- BindingIdentifier の BoundNames を返す
- BindingPattern の BoundNames を返す
13.3.3.2 静的セマンティクス(Static Semantics): ContainsExpression
- false を返す
- BindingPropertyList の ContainsExpression を返す
- false を返す
- BindingRestElement の ContainsExpression を返す
- BindingElementList の ContainsExpression を返す
- BindingElementList の ContainsExpression を has とする
- has が true なら、 true を返す
- BindingRestElement の ContainsExpression を返す
- BindingPropertyList の ContainsExpression を has とする
- has が true なら、 true を返す
- BindingProperty の ContainsExpression を返す
- BindingElementList の ContainsExpression を has とする
- has が true なら、 true を返す
- BindingElisionElement の ContainsExpression を返す
- BindingElement の ContainsExpression を返す
- PropertyName の IsComputedPropertyKey を has とする
- has が true なら、 true を返す
- BindingElement の ContainsExpression を返す
- true を返す
- false を返す
- true を返す
- false を返す
- BindingPattern の ContainsExpression を返す
13.3.3.3 静的セマンティクス(Static Semantics): HasInitializer
- false を返す
- true を返す
- false を返す
- true を返す
13.3.3.4 静的セマンティクス(Static Semantics): IsSimpleParameterList
- false を返す
- false を返す
- true を返す
- false を返す
13.3.3.5 ランタイムセマンティクス(Runtime Semantics): BindingInitialization
引数 value と environment を使用。
- ? RequireObjectCoercible(value) を実行する
- 引数 value と environment を使用して ObjectBindingPattern の BindingInitialization の実行結果を返す
- ? GetIterator(value) を iteratorRecord とする
- 引数 iteratorRecord と environment を使用して ArrayBindingPattern の IteratorBindingInitialization を result とする
- iteratorRecord.[[Done]] が false なら、 ? IteratorClose(iteratorRecord, result)を返す
- result を返す
- NormalCompletion(empty) を返す
- 引数 value と environment を使用して ? BindingPropertyList の PropertyBindingInitialization を実行する
- NormalCompletion(empty) を返す
- 空の新規List を excludedNames とする
- 引数 value と environment と excludedNames を使用して BindingRestProperty の RestBindingInitialization の実行結果を返す
- 引数 value と environment を使用して ? BindingPropertyList の PropertyBindingInitialization を excludedNames とする
- 引数 value と environment と excludedNames を使用して BindingRestProperty の RestBindingInitialization の実行結果を返す
13.3.3.6 ランタイムセマンティクス(Runtime Semantics): PropertyBindingInitialization
引数 value environment を使用。
- 引数 value と environment を使用して ? BindingPropertyList の PropertyBindingInitialization を boundNames とする
- 引数 value と environment を使用して ? BindingProperty の PropertyBindingInitialization を nextNames とする
- boundNames の 最後に nextNames のアイテムを追加する
- boundNames を返す
- SingleNameBinding の BoundNames の唯一の要素である文字列を name とする
- 引数 value と environment と name を使用して ? SingleNameBinding の KeyedBindingInitialization を実行する
- name を含む新規List を返す
- PropertyName の評価結果を P とする
- ReturnIfAbrupt(P)
- 引数 value と environment と P を使用して ? BindingElement の KeyedBindingInitialization を実行する
- P を含む新規List を返す
13.3.3.7 ランタイムセマンティクス(Runtime Semantics): RestBindingInitialization
引数 value environment excludedNames を使用。
- ? ResolveBinding(BindingIdentifier の StringValue, environment) を lhs とする
- OrdinaryObjectCreate(%Object.prototype%) を restObj とする
- ? CopyDataProperties(restObj, value, excludedNames) を実行する
- environment が undefined なら、 PutValue(lhs, restObj)を返す
- InitializeReferencedBinding(lhs, restObj) を返す
13.3.3.8 ランタイムセマンティクス(Runtime Semantics): IteratorBindingInitialization
引数 iteratorRecord と environment を使用。
- NormalCompletion(empty) を返す
- 引数 iteratorRecord を使用して Elision の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- Elision が 存在するなら、
- 引数 iteratorRecord と environment を使用して BindingRestElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して BindingElementList の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して BindingElementList の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して ? BindingElementList の IteratorBindingInitialization を実行する
- 引数 iteratorRecord を使用して Elision の IteratorDestructuringAssignmentEvaluation の実行結果を返す
- 引数 iteratorRecord と environment を使用して ? BindingElementList の IteratorBindingInitialization を実行する
- Elision が存在するなら、
- 引数 iteratorRecord と environment を使用して BindingRestElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して BindingElisionElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して ? BindingElementList の IteratorBindingInitialization を実行する
- 引数 iteratorRecord と environment を使用して BindingElisionElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して BindingElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord を使用して ? Elision の IteratorDestructuringAssignmentEvaluation を実行する
- 引数 iteratorRecord と environment を使用して BindingElement の IteratorBindingInitialization の実行結果を返す
- 引数 iteratorRecord と environment を使用して SingleNameBinding の IteratorBindingInitialization の実行結果を返す
- BindingIdentifier の StringValue を bindingId とする
- ? ResolveBinding(bindingId, environment) を lhs とする
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、 true を iteratorRecord.[[Done]] にセットする
- d. でないなら、
- IteratorValue(next) を v とする
- v が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(v)
- iteratorRecord.[[Done]] が true なら、 undefined を v とする
- Initializer が存在し、 v が undefined なら、
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 bindingId を使用して Initializer の NamedEvaluation の実行結果を v にセットする
- a. でないなら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v にセットする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- environment が undefined なら、 ? PutValue(lhs, v)を返す
- InitializeReferencedBinding(lhs, v) を返す
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、 true を iteratorRecord.[[Done]] にセットする
- d. でないなら、
- IteratorValue(next) を v とする
- v が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(v)
- iteratorRecord.[[Done]] が true なら、 undefined を v とする
- Initializer が存在し、 v が undefined なら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v にセットする
- 引数 v と environment を使用して BindingPattern の BindingInitialization の実行結果を返す
- BindingIdentifier , environment) の ? ResolveBinding(StringValue を lhs とする
- ! ArrayCreate(0) を A とする
- 0 を n とする
- 次を繰り返す、
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、 true を iteratorRecord.[[Done]] にセットする
- iteratorRecord.[[Done]] が true なら、
- environment が undefined なら、 ? PutValue(lhs, A)を返す
- InitializeReferencedBinding(lhs, A) を返す
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(nextValue)
- ! CreateDataPropertyOrThrow(A, ! ToString(n), nextValue) を実行する
- n + 1 を n にセットする
- iteratorRecord.[[Done]] が false なら、
- ! ArrayCreate(0) を A とする
- 0 を n とする
- 次を繰り返す、
- iteratorRecord.[[Done]] が false なら、
- IteratorStep(iteratorRecord) を next とする
- next が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(next)
- next が false なら、 true を iteratorRecord.[[Done]] にセットする
- iteratorRecord.[[Done]] が true なら、
- 引数 A と environment を使用して BindingPattern の BindingInitialization の実行結果を返す
- IteratorValue(next) を nextValue とする
- nextValue が 突然の完了 なら、 true を iteratorRecord.[[Done]] にセットする
- ReturnIfAbrupt(nextValue)
- ! CreateDataPropertyOrThrow(A, ! ToString(n), nextValue) を実行する
- n + 1 を n にセットする
- iteratorRecord.[[Done]] が false なら、
13.3.3.9 ランタイムセマンティクス(Runtime Semantics): KeyedBindingInitialization
引数 value と environment と propertyName を使用。
- ? GetV(value, propertyName) を v とする
- Initializer が存在し、 v が undefined なら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v にセットする
- 引数 v と environment を使用して BindingPattern の BindingInitialization の実行結果を返す
- BindingIdentifier の StringValue を bindingId とする
- ? ResolveBinding(bindingId, environment) を lhs とする
- ? GetV(value, propertyName) を v とする
- Initializer が存在し、 v が undefined なら、
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- 引数 bindingId を使用して Initializer の NamedEvaluation の実行結果を v にセットする
- a. と異なるなら、
- Initializer の評価結果を defaultValue とする
- ? GetValue(defaultValue) を v にセットする
- IsAnonymousFunctionDefinition(Initializer ) が true なら、
- environment が undefined なら、 ? PutValue(lhs, v)を返す
- InitializeReferencedBinding(lhs, v) を返す
13.4 空文-空のステートメント-(Empty Statement)
構文:
const a=[]; for( let i = 0; i < 5 ; i++) { a.push(i);} // 通常は文が必要 for( let i = 0; i < 5 ; a.push(i++)) ; // 文のかわりに空文
13.4.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- NormalCompletion(empty) を返す
13.5 式ステートメント(Expression Statement)
構文:
[lookahead ∉ { {, function, async [no LineTerminator here] function, class, let [ }]Expression[+In, ?Yield, ?Await] ;
FunctionDeclaration、GeneratorDeclaration、ClassDeclarationとあいまいになるため、ExpressionStatementは、functionまたはclassキーワードで開始することはできません。
AsyncFunctionDeclaration、AsyncGeneratorDeclarationとあいまいになるため、ExpressionStatementは、async functionで開始することはできません。
最初のLexicalBindingがArrayBindingPatternであるとき let LexicalDeclarationとあいまいになるため、ExpressionStatementは、2つのトークンシーケンス let [ で開始できません。
13.5.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を返す
13.6 ifステートメント(The if Statement)
構文:
if(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return] elseStatement[?Yield, ?Await, ?Return]
if(Expression[+In, ?Yield, ?Await] )Statement[?Yield, ?Await, ?Return]
ifとelseの対応があいまいで対応するelseがない場合、最も近いifに関連付けられるものとします。
13.6.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- IsLabelledFunction(Statement ) が true なら、構文エラー
13.6.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.6.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.6.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.6.5 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の VarDeclaredNames を返す
13.6.6 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の VarScopedDeclarations を返す
13.6.7 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を exprRef とする
- ! ToBoolean(? GetValue(exprRef)) を exprValue とする
- exprValue が true なら、
- 最初の Statement の評価結果を stmtCompletion とする
- 3. と異なるなら、
- 2番目の Statement の評価結果を stmtCompletion とする
- Completion( UpdateEmpty(stmtCompletion, undefined)) を返す
- Expression の評価結果を exprRef とする
- ! ToBoolean(? GetValue(exprRef)) を exprValue とする
- exprValue が false なら、
- NormalCompletion(undefined) を返す
- 8. と異なるなら、
- Statement の評価結果を stmtCompletion とする
- Completion( UpdateEmpty(stmtCompletion, undefined)) を返す
13.7 反復ステートメント(Iteration Statements)
構文:
IterationStatement[Yield, Await, Return] :
ForDeclaration[Yield, Await] :
13.7.1 セマンティクス(Semantics)
13.7.1.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- IsLabelledFunction(Statement ) が true なら構文エラーです。
13.7.1.2 ランタイムセマンティクス(Runtime Semantics): LoopContinues ( completion, labelSet )
引数completionおよびlabelSetを使用した抽象操作LoopContinuesは、次の手順で定義されます。
- completion.[[Type]] が normal なら、 true を返す
- completion.[[Type]] が continue でないなら、 false を返す
- completion.[[Target]] が empty なら、 true を返す
- completion.[[Target]] が labelSet の要素なら、 true を返す
- false を返す
13.7.2 do-whileステートメント(The do-while Statement)
13.7.2.1 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.7.2.2 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.7.2.3 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.7.2.4 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の VarDeclaredNames を返す
13.7.2.5 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の VarScopedDeclarations を返す
13.7.2.6 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- undefined を V とする
- 繰り返す、
- Statement の評価結果を stmtResult とする
- LoopContinues(stmtResult, labelSet) が false なら、 Completion( UpdateEmpty(stmtResult, V))を返す
- stmtResult.[[Value]] が empty でないなら、 stmtResult.[[Value]] を V にセットする
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を exprValue とする
- ! ToBoolean(exprValue) が false なら、 NormalCompletion(V)を返す
13.7.3 whileステートメント(The while Statement)
13.7.3.1 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.7.3.2 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.7.3.3 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.7.3.4 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の VarDeclaredNames を返す
13.7.3.5 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の VarScopedDeclarations を返す
13.7.3.6 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- undefined を V とする
- 繰り返す
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を exprValue とする
- ! ToBoolean(exprValue) が false なら、 NormalCompletion(V)を返す
- Statement の評価結果を stmtResult とする
- LoopContinues(stmtResult, labelSet) が false なら、 Completion( UpdateEmpty(stmtResult, V))を返す
- stmtResult.[[Value]] が empty でないなら、 stmtResult.[[Value]] を V にセットする
13.7.4 forステートメント(The for Statement)
13.7.4.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- LexicalDeclaration の BoundNames の要素が Statement の VarDeclaredNames でも出現する場合は、構文エラーです。
13.7.4.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.7.4.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.7.4.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.7.4.5 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の the VarDeclaredNames を返す
- VariableDeclarationList の BoundNames を names とする
- Statement の VarDeclaredNames の要素を names に追加する
- names を返す
- Statement の VarDeclaredNames を返す
13.7.4.6 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の VarScopedDeclarations を返す
- VariableDeclarationList の VarScopedDeclarations を declarations とする
- Statement の VarScopedDeclarations の要素を declarations に追加する
- declarations を返す
- Statement の VarScopedDeclarations を返す
13.7.4.7 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- 最初の Expression が存在するなら、
- 最初の Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を実行する
- ? ForBodyEvaluation(2番目の Expression , 3番目の Expression , Statement , « », labelSet) を返す
- VariableDeclarationList の評価結果を varDcl とする
- ReturnIfAbrupt(varDcl)
- ? ForBodyEvaluation(最初の Expression , 2番目の Expression , Statement , « », labelSet) を返す
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- NewDeclarativeEnvironment(oldEnv) を loopEnv とする
- loopEnv の EnvironmentRecord を loopEnvRec とする
- LexicalDeclaration の IsConstantDeclaration を isConst とする
- LexicalDeclaration の BoundNames を boundNames とする
- boundNames の 各要素を dn とし、dn ごとに次を実行する
- loopEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- LexicalDeclaration の評価結果を forDcl とする
- forDcl が 突然の完了 なら、
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- Completion(forDcl) を返す
- isConst が false なら boundNames を、 異なるなら « » を perIterationLets とする
- ForBodyEvaluation(最初の Expression , 2番目の Expression , Statement , perIterationLets, labelSet) を bodyResult とする
- oldEnv を 実行中の実行コンテキスト's LexicalEnvironment にセットする
- Completion(bodyResult) を返す
13.7.4.8 ランタイムセマンティクス(Runtime Semantics): ForBodyEvaluation ( test, increment, stmt, perIterationBindings, labelSet )
引数test, increment, stmt, perIterationBindings, labelSetを使用した抽象操作ForBodyEvaluationは、次のように実行されます。
- undefined を V とする
- ? CreatePerIterationEnvironment(perIterationBindings) を実行する
- 繰り返す、
- test が [empty] でないなら、
- test の評価結果を testRef とする
- ? GetValue(testRef) を testValue とする
- ! ToBoolean(testValue) が false なら、 NormalCompletion(V) を返す
- stmt の評価結果を result とする
- LoopContinues(result, labelSet) が false なら、 Completion( UpdateEmpty(result, V)) を返す
- result.[[Value]] が empty でないなら、 result.[[Value]] を V にセットする
- ? CreatePerIterationEnvironment(perIterationBindings) を実行する
- increment が [empty] でないなら、
- test が [empty] でないなら、
13.7.4.9 ランタイムセマンティクス(Runtime Semantics): CreatePerIterationEnvironment ( perIterationBindings )
引数 perIterationBindingsを使用した抽象操作CreatePerIterationEnvironmentは、次のように実行されます。
- perIterationBindings に要素があるなら、
- 実行中の実行コンテキスト の LexicalEnvironment を lastIterationEnv とする
- lastIterationEnv の EnvironmentRecord を lastIterationEnvRec とする
- lastIterationEnv の外部環境参照を outer とする
- Assert: outer は null ではない
- NewDeclarativeEnvironment(outer) を thisIterationEnv とする
- thisIterationEnv の EnvironmentRecord を thisIterationEnvRec とする
- perIterationBindings の 各要素を bn とし、bn ごとに次を実行する
- thisIterationEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- undefined を返す
13.7.5 for-in、for-of、for-await-ofステートメント(The for-in, for-of, and for-await-of Statements)
13.7.5.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
LeftHandSideExpression が ObjectLiteral またはArrayLiteral の場合、次の早期エラールールが適用されます。
- LeftHandSideExpression が AssignmentPattern によってカバーされていない場合、構文エラーです
- AssignmentPattern とその派生プロダクションのすべての早期エラールールは、LeftHandSideExpression でカバーされる AssignmentPattern にも適用されます。
LeftHandSideExpression が ObjectLiteral と ArrayLiteral のどちらでもない場合、次の早期エラールールが適用されます。
- LeftHandSideExpression の AssignmentTargetType が simple でない場合、構文エラーです
- ForDeclaration の BoundNames が "let" を含んでいる場合、構文エラーです
- ForDeclaration の BoundNames の要素が Statement の VarDeclaredNames でも出現する場合、構文エラーです
- ForDeclaration の BoundNames に重複する要素が含まれている場合、構文エラーです
13.7.5.2 静的セマンティクス(Static Semantics): BoundNames
- ForBinding の BoundNames を返す
13.7.5.3 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.7.5.4 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.7.5.5 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.7.5.6 静的セマンティクス(Static Semantics): IsDestructuring
- ForBinding の IsDestructuring を返す
- false を返す
- true を返す
13.7.5.7 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の VarDeclaredNames を返す
- ForBinding の BoundNames を names とする
- Statement の VarDeclaredNames の要素を names に追加する
- names を返す
13.7.5.8 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の VarScopedDeclarations を返す
- ForBinding を含む List を declarations とする
- Statement の VarScopedDeclarations の要素を declarations に追加する
- declarations を返す
13.7.5.9 ランタイムセマンティクス(Runtime Semantics): BindingInitialization
引数 value と environment を使用。
- 引数 value と environment を使用して ForBinding の BindingInitialization の実行結果を返す
13.7.5.10 ランタイムセマンティクス(Runtime Semantics): BindingInstantiation
引数 environment を使用。
- environment の EnvironmentRecord を envRec とする
- Assert: envRec は 宣言型環境レコード
- ForBinding の BoundNames の 各要素を name とし、name ごとに次を実行する
- LetOrConst の IsConstantDeclaration が true なら、
- ! envRec.CreateImmutableBinding(name, true) を実行する
- a. と異なるなら、
- ! envRec.CreateMutableBinding(name, false) を実行する
- LetOrConst の IsConstantDeclaration が true なら、
13.7.5.11 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- ? ForIn/OfHeadEvaluation(« », Expression , enumerate) を keyResult とする
- ? ForIn/OfBodyEvaluation(LeftHandSideExpression , Statement , keyResult, enumerate, assignment, labelSet) を返す
- ? ForIn/OfHeadEvaluation(« », Expression , enumerate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForBinding , Statement , keyResult, enumerate, varBinding, labelSet) を返す
- ? ForIn/OfHeadEvaluation( ForDeclaration の BoundNames , Expression , enumerate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForDeclaration , Statement , keyResult, enumerate, lexicalBinding, labelSet) を返す
- ? ForIn/OfHeadEvaluation(« », AssignmentExpression , iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(LeftHandSideExpression , Statement , keyResult, iterate, assignment, labelSet) を返す
- ? ForIn/OfHeadEvaluation(« », AssignmentExpression , iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForBinding , Statement , keyResult, iterate, varBinding, labelSet) を返す
- ? ForIn/OfHeadEvaluation(ForDeclaration の BoundNames , AssignmentExpression , iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForDeclaration , Statement , keyResult, iterate, lexicalBinding, labelSet) を返す
- ? ForIn/OfHeadEvaluation(« », AssignmentExpression , async-iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(LeftHandSideExpression , Statement , keyResult, iterate, assignment, labelSet, async) を返す
- ? ForIn/OfHeadEvaluation(« », AssignmentExpression , async-iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForBinding , Statement , keyResult, iterate, varBinding, labelSet, async) を返す
- ? ForIn/OfHeadEvaluation( ForDeclaration の BoundNames , AssignmentExpression , async-iterate) を keyResult とする
- ? ForIn/OfBodyEvaluation(ForDeclaration , Statement , keyResult, iterate, lexicalBinding, labelSet, async) を返す
13.7.5.12 ランタイムセマンティクス(Runtime Semantics): ForIn/OfHeadEvaluation ( uninitializedBoundNames, expr, iterationKind )
抽象演算For/OfHeadEvaluationは、引数uninitializedBoundNames, expr, iterationKindを使用して呼び出されます。 iterationKindの値は、enumerate、iterate、async-iterateのいずれかです。
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- uninitializedBoundNames が空のリストでないなら、
- Assert: uninitializedBoundNames の要素は重複なし
- NewDeclarativeEnvironment(oldEnv) を newEnv とする
- newEnv の EnvironmentRecord を newEnvRec とする
- uninitializedBoundNames の文字列要素を name とし、各 name ごとに次を実行する
- ! newEnvRec.CreateMutableBinding(name, false) を実行する
- newEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- expr の評価結果を exprRef とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- ? GetValue(exprRef) を exprValue とする
- iterationKind が enumerate なら、
- exprValue が undefined か null なら、
- Completion { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す
- ! ToObject(exprValue) を obj とする
- ? EnumerateObjectProperties(obj) を返す
- exprValue が undefined か null なら、
- 6. と異なるなら、
- Assert: iterationKind は iterate か async-iterate
- iterationKind が async-iterate なら、 async を iteratorHint とする
- b. と異なるなら、 sync を iteratorHint とする
- ? GetIterator(exprValue, iteratorHint) を返す
13.7.5.13 ランタイムセマンティクス(Runtime Semantics): ForIn/OfBodyEvaluation ( lhs, stmt, iteratorRecord, iterationKind, lhsKind, labelSet [ , iteratorKind ] )
抽象操作ForIn/OfBodyEvaluationは、引数lhs、stmt、iteratorRecord、iterationKind、lhsKind、labelSet、およびオプションの引数iteratorKindを使用して呼び出されます。 lhsKindの値は、assignment、varBinding、lexicalBindingのいずれかです。 iteratorKindの値は、syncまたはasyncです。
- iteratorKind が存在しないなら、 sync を iteratorKind にセットする
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- undefined を V とする
- lhs の IsDestructuring を destructuring とする
- destructuring が true で lhsKind が assignment なら、
- Assert: lhs は LeftHandSideExpression
- lhs によってカバーされているAssignmentPattern を assignmentPattern とする
- 繰り返す
- ? Call(iteratorRecord.[[NextMethod]], iteratorRecord.[[Iterator]]) を nextResult とする
- iteratorKind が async なら、 ? Await(nextResult) を nextResult にセットする
- Type(nextResult) が Object型 でないなら、 TypeError例外をスローする
- ? IteratorComplete(nextResult) を done とする
- done が true なら、 NormalCompletion(V) を返す
- ? IteratorValue(nextResult) を nextValue とする
- lhsKind が assignment か varBinding なら、
- destructuring が false なら、
- lhs の評価結果を lhsRef とする。 (繰り返し評価される場合があり)
- destructuring が false なら、
- g. と異なるなら、
- Assert: lhsKind は lexicalBinding
- Assert: lhs は ForDeclaration
- NewDeclarativeEnvironment(oldEnv) を iterationEnv とする
- 引数 iterationEnv を使用して、lhs の BindingInstantiation を実行する
- iterationEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- destructuring が false なら、
- Assert: lhs は単一の名前をバインドしている
- lhs の BoundNames の唯一の要素を lhsName とする
- ! ResolveBinding(lhsName) を lhsRef とする
- destructuring が false なら、
- lhsRef が an 突然の完了 なら、
- lhsRef を status とする
- i. と異なるなり、 lhsKind が lexicalBinding なら、
- InitializeReferencedBinding(lhsRef, nextValue) を status とする
- ii. と異なるなら、
- PutValue(lhsRef, nextValue) を status とする
- lhsRef が an 突然の完了 なら、
- i. と異なるなら、
- lhsKind が assignment なら、
- 引数 nextValue を使用して assignmentPattern の DestructuringAssignmentEvaluation を status とする
- i. と異なるなり、 lhsKind が varBinding なら、
- Assert: lhs は ForBinding
- 引数 nextValue と undefined を使用して lhs の BindingInitialization を status とする
- ii. と異なるなら、
- Assert: lhsKind は lexicalBinding
- Assert: lhs は ForDeclaration
- 引数 nextValue と iterationEnv を使用して lhs の BindingInitialization を status とする
- lhsKind が assignment なら、
- status が 突然の完了 なら、
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- iteratorKind が async なら、 ? AsyncIteratorClose(iteratorRecord, status) を返す
- iterationKind が enumerate なら、
- status を返す
- iii. と異なるなら、
- Assert: iterationKind は iterate
- ? IteratorClose(iteratorRecord, status) を返す
- stmt の評価結果を result とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- LoopContinues(result, labelSet) が false なら、
- iterationKind が enumerate なら、
- Completion( UpdateEmpty(result, V)) を返す
- i. と異なるなら、
- Assert: iterationKind は iterate
- UpdateEmpty(result, V) を status にセットする
- iteratorKind が async なら、 ? AsyncIteratorClose(iteratorRecord, status) を返す
- ? IteratorClose(iteratorRecord, status) を返す
- iterationKind が enumerate なら、
- result.[[Value]] が empty でないなら、 result.[[Value]] を V にセットする
13.7.5.14 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- BindingIdentifier の StringValue を bindingId とする
- ? ResolveBinding(bindingId) を返す
13.7.5.15 EnumerateObjectProperties ( O )
抽象操作EnumerateObjectPropertiesが引数 Oで呼び出されると、次の手順が実行されます。
イテレータのthrowメソッドとreturnメソッドはnullであり、呼び出されることはありません。 nextメソッドは、オブジェクトのプロパティを処理して、プロパティキーをイテレータ値として返す必要があるかどうかを判断します。 返されるプロパティキーには、シンボルキーは含まれません。 ターゲットオブジェクトのプロパティは、列挙中に削除されることがあります。 nextメソッドの処理前に削除されたプロパティは無視されます。 列挙中に新しいプロパティが追加された場合は、そのプロパティが列挙処理されるかどうかを保証されません。 プロパティ名は、nextメソッドで、一度だけ返されます。
ターゲットオブジェクトのプロパティ列挙は、プロトタイプのプロパティ、プロトタイプのプロトタイプを再帰的に列挙することなどが含まれます。 ただし、プロトタイプのプロパティは、nextメソッドによって処理済のプロパティと同名のものは処理されません。 [[Enumerable]]属性の値は、プロトタイプオブジェクトのプロパティがすでに処理されているかどうかの判断時に考慮されません。 プロトタイプオブジェクトの列挙可能なプロパティ名は、プロトタイプオブジェクトを引数として渡してEnumerateObjectPropertiesを呼び出すことによって取得します。 EnumerateObjectPropertiesは、[[OwnPropertyKeys]]内部メソッドを呼び出して、ターゲットオブジェクトの独自プロパティキーを取得します。 ターゲットオブジェクトのプロパティ属性は、その[[GetOwnProperty]]内部メソッドを呼び出すことによって取得します。
さらに、Oおよび、プロトタイプチェーン内のオブジェクトが、 Proxyエキゾチックオブジェクト、Integer-Indexedエキゾチックオブジェクト、モジュールネームスペースエキゾチックオブジェクト、または実装提供のエキゾチックオブジェクトのどれでもない場合、次のいずれかが発生するまで、イテレータはCreateForInIterator(O)で指定されたイテレータと同じように動作する必要があります。
- O の [[Prototype]]内部スロットまたは、そのプロトタイプチェーン内のオブジェクトの値が変更される
- プロパティが O またはそのプロトタイプチェーン内のオブジェクトから削除される
- O のプロトタイプチェーン内のオブジェクトにプロパティが追加される
- O のプロパティまたは、そのプロトタイプチェーン内のオブジェクトの[[Enumerable]]属性の値が変更される
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; } }
13.7.5.16 For-Inイテレーターオブジェクト(For-In Iterator Objects)
For-Inイテレーターは、特定のオブジェクトに対して反復をおこなうオブジェクトです。 For-Inイテレーターオブジェクトは、ECMAScriptコードに直接アクセスすることはできません。 これらは、EnumerateObjectPropertiesの動作を説明するためだけに存在します。
13.7.5.16.1 CreateForInIterator ( object )
引数objectを使用した抽象操作CreateForInIteratorは、objectの独自かつ継承可能で列挙可能な文字列プロパティを特定の順序で反復する For-Inイテレーターオブジェクトを作成するために使用されます。 次の手順を実行します。
- Assert: Type(object) は Object型
- OrdinaryObjectCreate(%ForInIteratorPrototype%, « [[Object]], [[ObjectWasVisited]], [[VisitedKeys]], [[RemainingKeys]] ») を iterator とする
- object を iterator.[[Object]] にセットする
- false を iterator.[[ObjectWasVisited]] にセットする
- 空の新規List を iterator.[[VisitedKeys]] にセットする
- 空の新規List を iterator.[[RemainingKeys]] にセットする
- iterator を返す
13.7.5.16.2 The %ForInIteratorPrototype% Object
%ForInIteratorPrototype%オブジェクトは、
- すべてのFor-Inイテレータオブジェクトに継承されるプロパティがあります。
- 通常のオブジェクトです。
- [[Prototype]]内部スロットがあり、その値は組み込みオブジェクト%IteratorPrototype% です。
- ECMAScriptコードに直接アクセスすることはできません。
- 以降のプロパティを所持しています。
13.7.5.16.2.1 %ForInIteratorPrototype%.next ( )
- this値を O とする
- Assert: Type(O) は Object型
- Assert: O は、For-Inイテレータインスタンスのすべての内部スロットがある (13.7.5.16.3)
- O.[[Object]] を object とする
- O.[[VisitedKeys]] を visited とする
- O.[[RemainingKeys]] を remaining とする
- 繰り返す、
- O.[[ObjectWasVisited]] が false なら、
- remaining がemptyでない間繰り返し、
- remaining から最初の要素を削除し、要素の値を r とする
- SameValue(r, v) が true となる要素 v が visited に存在しないなら、
- ? object.[[GetOwnProperty]](r) を desc とする
- desc が undefined でないなら、
- visited に r を追加する
- desc.[[Enumerable]] が true なら、 CreateIterResultObject(r, false) を返す
- ? object.[[GetPrototypeOf]]() を object にセットする
- object を O.[[Object]] にセットする
- false を O.[[ObjectWasVisited]] にセットする
- object が null なら、 CreateIterResultObject(undefined, true) を返す
13.7.5.16.3 For-Inイテレータインスタンスのプロパティ(Properties of For-In Iterator Instances)
For-Inイテレータインスタンスは、%ForInIteratorPrototype%組み込みオブジェクトからプロパティを継承する通常のオブジェクトです。 For-Inイテレータインスタンスは、最初に表36にリストされている内部スロットを使用して作成されます。
内部スロット | 内容 |
---|---|
[[Object]] | 対象オブジェクト |
[[ObjectWasVisited]] | イテレータが[[Object]]で[[OwnPropertyKeys]]を呼び出した場合はtrue、それ以外の場合はfalse。 |
[[VisitedKeys]] | 発行済文字列値リスト |
[[RemainingKeys]] | プロトタイプのプロパティを反復する前に、現在のオブジェクトで未出力の文字列値のリスト(プロトタイプがnullでない場合)。 |
13.8 continueステートメント(The continue Statement)
構文:
13.8.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- ContinueStatement が直接または間接的に(ただし、関数の境界を越えない)ネストされていない場合、 IterationStatement 内で構文エラーになります。
13.8.2 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
- false を返す
- LabelIdentifier の StringValue が iterationSet の要素でないなら、 true を返す
- false を返す
13.8.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Completion { [[Type]]: continue, [[Value]]: empty, [[Target]]: empty } を返す
- LabelIdentifier の StringValue を label とする
- Completion { [[Type]]: continue, [[Value]]: empty, [[Target]]: label } を返す
13.9 breakステートメント(The break Statement)
構文:
13.9.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- BreakStatementが、直接または間接的に(ただし、関数の境界を越えない)ネストされていない場合、IterationStatement または SwitchStatement 内で構文エラーになります。
13.9.2 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- false を返す
- LabelIdentifier の StringValue が labelSet の要素でないなら、 true を返す
- false を返す
13.9.3 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Completion { [[Type]]: break, [[Value]]: empty, [[Target]]: empty } を返す
- LabelIdentifier の StringValue を label とする
- Completion { [[Type]]: break, [[Value]]: empty, [[Target]]: label } を返す
13.10 returnステートメント(The return Statement)
構文:
13.10.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Completion { [[Type]]: return, [[Value]]: undefined, [[Target]]: empty } を返す
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を exprValue とする
- ! GetGeneratorKind() が async なら、 ? Await(exprValue) を exprValue にセットする
- Completion { [[Type]]: return, [[Value]]: exprValue, [[Target]]: empty } を返す
13.11 withステートメント(The with Statement)
構文:
13.11.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- このプロダクションに一致するコードが strictモードコード に含まれているなら、構文エラー
- IsLabelledFunction(Statement ) が true なら、構文エラー
13.11.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsDuplicateLabels の実行結果を返す
13.11.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Statement の ContainsUndefinedBreakTarget の実行結果を返す
13.11.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
13.11.5 静的セマンティクス(Static Semantics): VarDeclaredNames
- Statement の VarDeclaredNames を返す
13.11.6 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Statement の the VarScopedDeclarations を返す
13.11.7 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を val とする
- ? ToObject(? GetValue(val)) を obj とする
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- NewObjectEnvironment(obj, oldEnv) を newEnv とする
- true を newEnv の EnvironmentRecord の withEnvironment フラグにセットする
- newEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- Statement の評価結果を C とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- Completion( UpdateEmpty(C, undefined)) を返す
13.12 switchステートメント(The switch Statement)
構文:
13.12.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- 重複するエントリが CaseBlock の LexicallyDeclaredNames に含まれている場合、構文エラーになります。
- CaseBlock の LexicallyDeclaredNames の要素が CaseBlock の VarDeclaredNames でも発生する場合は、構文エラーです。
13.12.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して CaseBlock の ContainsDuplicateLabels の実行結果を返す
- false を返す
- 最初の CaseClauses が存在するなら、
- 引数 labelSet を使用して 最初の CaseClauses の ContainsDuplicateLabels を hasDuplicates とする
- hasDuplicates が true なら、 true を返す
- 引数 labelSet を使用して DefaultClause の ContainsDuplicateLabels を hasDuplicates とする
- hasDuplicates が true なら、 true を返す
- 2番目の CaseClauses が存在しないなら、 false を返す
- 引数 labelSet を使用して 2番目の CaseClauses の ContainsDuplicateLabels の実行結果を返す
- 引数 labelSet を使用して CaseClauses の ContainsDuplicateLabels を hasDuplicates とする
- hasDuplicates が true なら、 true を返す
- 引数 labelSet を使用して CaseClause の ContainsDuplicateLabels の実行結果を返す
- StatementList が存在するなら、 引数 labelSet を使用して StatementList の ContainsDuplicateLabels の実行結果を返す
- false を返す
- StatementList が存在するなら、 引数 labelSet を使用して StatementList の ContainsDuplicateLabels の実行結果を返す
- false を返す
13.12.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して CaseBlock の ContainsUndefinedBreakTarget の実行結果を返す
- false を返す
- 最初の CaseClauses が存在するなら、
- 引数 labelSet を使用して 最初の CaseClauses の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 labelSet を使用して DefaultClause の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 2番目の CaseClauses が存在しないなら、 false を返す
- 引数 labelSet を使用して 2番目の CaseClauses の ContainsUndefinedBreakTarget の実行結果を返す
- 引数 labelSet を使用して CaseClauses の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 labelSet を使用して CaseClause の ContainsUndefinedBreakTarget の実行結果を返す
- StatementList が存在するなら、 引数 labelSet を使用して StatementList の ContainsUndefinedBreakTarget の実行結果を返す
- false を返す
- StatementList が存在するなら、 引数 labelSet を使用して StatementList の ContainsUndefinedBreakTarget の実行結果を返す
- false を返す
13.12.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
- false を返す
- 最初の CaseClauses が存在するなら、
- 引数 iterationSet と « » を使用して 最初の CaseClauses の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 iterationSet と « » を使用して DefaultClause の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 2番目の CaseClauses が存在しないなら、 false を返す
- 引数 iterationSet と « » を使用して 2番目の CaseClauses の ContainsUndefinedContinueTarget の実行結果を返す
- 引数 iterationSet と « » を使用して CaseClauses の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 iterationSet と « » を使用して CaseClause の ContainsUndefinedContinueTarget の実行結果を返す
- StatementList が存在するなら、 引数 iterationSet と « » を使用して StatementList の ContainsUndefinedContinueTarget の実行結果を返す
- false を返す
- StatementList が存在するなら、 引数 iterationSet と « » を使用して StatementList の ContainsUndefinedContinueTarget の実行結果を返す
- false を返す
13.12.5 静的セマンティクス(Static Semantics): LexicallyDeclaredNames
- 空の新規List を返す
- 最初の CaseClauses が存在するなら、最初の CaseClauses の LexicallyDeclaredNames を names とする
- 2. と異なるなら、 空の新規List を names とする
- DefaultClause の LexicallyDeclaredNames の要素を names に追加する
- 2番目の CaseClauses が存在しないなら、 names を返す
- 2番目の CaseClauses の LexicallyDeclaredNames の要素を names に追加した結果を返す
- CaseClauses の LexicallyDeclaredNames を names とする
- CaseClause の LexicallyDeclaredNames の要素を names に追加する
- names を返す
- StatementList が存在するなら、 StatementList の LexicallyDeclaredNames を返す
- 空の新規List を返す
- StatementList が存在するなら、 StatementList の LexicallyDeclaredNames を返す
- 空の新規List を返す
13.12.6 静的セマンティクス(Static Semantics): LexicallyScopedDeclarations
- 空の新規List を返す
- 最初の CaseClauses が存在するなら、 最初の CaseClauses の LexicallyScopedDeclarations を declarations とする
- 2. と異なるなら、 空の新規List を declarations とする
- DefaultClause の LexicallyScopedDeclarations の要素を declarations に追加する
- 2番目の CaseClauses が存在しないなら、 declarations を返す
- 2番目の CaseClauses の LexicallyScopedDeclarations の要素を declarations に追加した結果を返す
- CaseClauses の LexicallyScopedDeclarations を declarations とする
- CaseClause の LexicallyScopedDeclarations の要素を declarations に追加する
- declarations を返す
- StatementList が存在するなら、 StatementList の LexicallyScopedDeclarations を返す
- 空の新規List を返す
- StatementList が存在するなら、 StatementList の the LexicallyScopedDeclarations を返す
- 空の新規List を返す
13.12.7 静的セマンティクス(Static Semantics): VarDeclaredNames
- CaseBlock の VarDeclaredNames を返す
- 空の新規List を返す
- 最初の CaseClauses が存在するなら、 最初の CaseClauses の VarDeclaredNames を names とする
- 3. と異なるなら、 空の新規List を names とする
- DefaultClause の VarDeclaredNames の要素を names に追加する
- 2番目の CaseClauses が 存在しないなら、 を返す names
- 2番目の CaseClauses の VarDeclaredNames の要素を names に追加した結果を返す
- CaseClauses の VarDeclaredNames を names とする
- CaseClause の VarDeclaredNames の要素を names に追加する
- names を返す
- StatementList が存在するなら、 StatementList の VarDeclaredNames を返す
- 空の新規List を返す
- StatementList が存在するなら、 StatementList の VarDeclaredNames を返す
- 空の新規List を返す
13.12.8 静的セマンティクス(Static Semantics): VarScopedDeclarations
- CaseBlock の VarScopedDeclarations を返す
- 空の新規List を返す
- 最初の CaseClauses が存在するなら、 最初の CaseClauses の VarScopedDeclarations を declarations とする
- 3. と異なるなら、 空の新規List を declarations とする
- DefaultClause の VarScopedDeclarations の要素を declarations に追加する
- 2番目の CaseClauses が存在しないなら、 declarations を返す
- 2番目の CaseClauses の VarScopedDeclarations の要素を declarations に追加した結果を返す
- CaseClauses の VarScopedDeclarations を declarations とする
- CaseClause の VarScopedDeclarations の要素を declarations に追加する
- declarations を返す
- StatementList が存在するなら、 StatementList の VarScopedDeclarations を返す
- 空の新規List を返す
- StatementList が存在するなら、 StatementList の VarScopedDeclarations を返す
- 空の新規List を返す
13.12.9 ランタイムセマンティクス(Runtime Semantics): CaseBlockEvaluation
引数 input を使用。
- NormalCompletion(undefined) を返す
- undefined を V とする
- CaseClauses の CaseClauseアイテムを、ソーステキスト順で List にしたものを A とする
- false を found とする
- A の 各 CaseClause を C とし、 C ごとに次を実行する
- found が false なら、
- ? CaseClauseIsSelected(C, input) を found にセットする
- found が true なら、
- C の評価結果を R とする
- R.[[Value]] が empty でないなら、 R.[[Value]] を V にセットする
- R が 突然の完了 なら、 Completion( UpdateEmpty(R, V)) を返す
- found が false なら、
- NormalCompletion(V) を返す
- undefined を V とする
- 最初の CaseClauses が 存在するなら、
- 最初の CaseClauses の CaseClause アイテムをソーステキスト順のリストにしたものを A とする
- 8. と異なるなら、
- false を found とする
- A の 各 CaseClause を C とし、 C ごとに次を実行する
- found が false なら、
- ? CaseClauseIsSelected(C, input) を found にセットする
- found が true なら、
- C の評価結果を R とする
- R.[[Value]] が empty でないなら、 R.[[Value]] を V にセットする
- R が 突然の完了 なら、 Completion( UpdateEmpty(R, V)) を返す
- found が false なら、
- false を foundInB とする
- 2番目の CaseClauses が存在するなら、
- 2番目の CaseClauses の CaseClauseアイテムをソーステキスト順のリストにしたものを B とする
- 13. と異なるなら、
- found が false なら、
- B の 各 CaseClause を C とし C ごとに次を実行する
- foundInB が false なら、
- ? CaseClauseIsSelected(C, input) を foundInB にセットする
- foundInB が true なら、
- CaseClause C の評価結果を R とする
- R.[[Value]] が empty でないなら、 R.[[Value]] を V にセットする
- R が 突然の完了 なら、 Completion( UpdateEmpty(R, V)) を返す
- foundInB が false なら、
- B の 各 CaseClause を C とし C ごとに次を実行する
- foundInB が true なら、 NormalCompletion(V) を返す
- DefaultClause の評価結果を R とする
- R.[[Value]] が empty でないなら、 R.[[Value]] を V にセットする
- R が 突然の完了 なら、 Completion( UpdateEmpty(R, V)) を返す
- NOTE: 以下は、2番目のCaseClausesの反復です。
- B の 各 CaseClause を C とし、 C ごとに次を実行する
- C の評価結果を R とする
- R.[[Value]] が empty でないなら、 R.[[Value]] を V にセットする
- R が 突然の完了 なら、 Completion( UpdateEmpty(R, V)) を返す
- NormalCompletion(V) を返す
13.12.10 ランタイムセマンティクス(Runtime Semantics): CaseClauseIsSelected ( C, input )
抽象演算CaseClauseIsSelectedは、CaseClause C と値inputが与えられると、C が入力と一致するかどうかを判別します。
- Assert: C は プロダクション CaseClause : caseExpression :StatementListopt のインスタンス
- C の Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を clauseSelector とする
- 厳密等値比較 input === clauseSelector の実行結果を返す
13.12.11 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を switchValue とする
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- NewDeclarativeEnvironment(oldEnv) を blockEnv とする
- BlockDeclarationInstantiation(CaseBlock , blockEnv) を実行する
- blockEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- 引数 switchValue を使用して CaseBlock の CaseBlockEvaluation を R とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- R を返す
- NormalCompletion(empty) を返す
- StatementList の 評価結果を返す
- NormalCompletion(empty) を返す
- StatementList の 評価結果を返す
13.13 ラベル付きステートメント(Labelled Statements)
構文:
13.13.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- ソーステキストがこのルールに一致する場合は、構文エラーです。
13.13.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- LabelIdentifier の StringValue を label とする
- label が labelSet の要素なら、 true を返す
- label を追加した labelSet のコピーを newLabelSet とする
- 引数 newLabelSet を使用して LabelledItem の ContainsDuplicateLabels の実行結果を返す
- false を返す
13.13.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- LabelIdentifier の StringValue を label とする
- label を追加した labelSet のコピーを newLabelSet とする
- 引数 newLabelSet を使用して LabelledItem の ContainsUndefinedBreakTarget の実行結果を返す
- false を返す
13.13.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
- LabelIdentifier の the StringValue を label とする
- label を追加した labelSet のコピーを newLabelSet とする
- 引数 iterationSet と newLabelSet を使用して LabelledItem の ContainsUndefinedContinueTarget の実行結果を返す
- false を返す
13.13.5 静的セマンティクス(Static Semantics): IsLabelledFunction ( stmt )
引数stmtを指定した抽象操作IsLabelledFunctionは、次の手順を実行します。
- stmt が LabelledStatement でないなら、 false を返す
- stmt の LabelledItem を item とする
- item が LabelledItem : FunctionDeclarationなら、 true を返す
- item の Statement を subStmt とする
- IsLabelledFunction(subStmt) を返す
13.13.6 静的セマンティクス(Static Semantics): LexicallyDeclaredNames
- LabelledItem の LexicallyDeclaredNames を返す
- 空の新規List を返す
- FunctionDeclaration の BoundNames を返す
13.13.7 静的セマンティクス(Static Semantics): LexicallyScopedDeclarations
- LabelledItem の the LexicallyScopedDeclarations を返す
- 空の新規List を返す
- FunctionDeclaration を含む新規List を返す
13.13.8 静的セマンティクス(Static Semantics): TopLevelLexicallyDeclaredNames
- 空の新規List を返す
13.13.9 静的セマンティクス(Static Semantics): TopLevelLexicallyScopedDeclarations
- 空の新規List を返す
13.13.10 静的セマンティクス(Static Semantics): TopLevelVarDeclaredNames
- LabelledItem の TopLevelVarDeclaredNames を返す
- Statement が Statement : LabelledStatement なら、 Statement の TopLevelVarDeclaredNames を返す
- Statement の VarDeclaredNames を返す
- FunctionDeclaration の BoundNames を返す
13.13.11 静的セマンティクス(Static Semantics): TopLevelVarScopedDeclarations
- LabelledItem の TopLevelVarScopedDeclarations を返す
- Statement が Statement : LabelledStatement なら、 Statement の TopLevelVarScopedDeclarations を返す
- Statement の VarScopedDeclarations を返す
- FunctionDeclaration を含む新規List を返す
13.13.12 静的セマンティクス(Static Semantics): VarDeclaredNames
- LabelledItem の VarDeclaredNames を返す
- 空の新規List を返す
13.13.13 静的セマンティクス(Static Semantics): VarScopedDeclarations
- LabelledItem の VarScopedDeclarations を返す
- 空の新規List を返す
13.13.14 ランタイムセマンティクス(Runtime Semantics): LabelledEvaluation
引数 labelSet を使用。
- LabelIdentifier の StringValue を label とする
- labelSet の要素として label を追加する
- 引数 labelSet を使用して LabelledItem の LabelledEvaluation を stmtResult とする
- stmtResult.[[Type]] が break で SameValue(stmtResult.[[Target]] , label) が true なら、
- NormalCompletion(stmtResult.[[Value]]) を stmtResult にセットする
- Completion(stmtResult) を返す
- Statement が LabelledStatement か BreakableStatement なら、
- 引数 labelSet を使用して Statement の LabelledEvaluation の実行結果を返す
- 6. と異なるなら、
- Statement の 評価結果を返す
- FunctionDeclaration の 評価結果を返す
13.13.15 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- 空の新規List を newLabelSet とする
- 引数 newLabelSet を使用して LabelledStatement の LabelledEvaluation の実行結果を返す
13.14 throwステートメント(The throw Statement)
構文:
13.14.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Expression の評価結果を exprRef とする
- ? GetValue(exprRef) を exprValue とする
- ThrowCompletion(exprValue) を返す
13.15 tryステートメント(The try Statement)
構文:
13.15.1 静的セマンティクス:早期エラー(Static Semantics: Early Errors)
- CatchParameter の BoundNames の要素が重複している場合、構文エラー
- CatchParameter の BoundNames の要素が Block の LexicallyDeclaredNames にもある場合は、構文エラー
- CatchParameter の BoundNames の要素が Block のVarDeclaredNames にもある場合は、構文エラーです。
13.15.2 静的セマンティクス(Static Semantics): ContainsDuplicateLabels
引数 labelSet を使用。
- 引数 labelSet を使用して Block の ContainsDuplicateLabels の実行結果を返す
13.15.3 静的セマンティクス(Static Semantics): ContainsUndefinedBreakTarget
引数 labelSet を使用。
- 引数 labelSet を使用して Block の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 labelSet を使用して Catch の ContainsUndefinedBreakTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 labelSet を使用して Finally の ContainsUndefinedBreakTarget の実行結果を返す
- 引数 labelSet を使用して Block の ContainsUndefinedBreakTarget の実行結果を返す
13.15.4 静的セマンティクス(Static Semantics): ContainsUndefinedContinueTarget
引数 iterationSet と labelSet を使用。
- 引数 iterationSet と « » を使用して Block の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 iterationSet と « » を使用して Catch の ContainsUndefinedContinueTarget を hasUndefinedLabels とする
- hasUndefinedLabels が true なら、 true を返す
- 引数 iterationSet と « » を使用して Finally の ContainsUndefinedContinueTarget の実行結果を返す
13.15.5 静的セマンティクス(Static Semantics): VarDeclaredNames
- Block の the VarDeclaredNames を返す
13.15.6 静的セマンティクス(Static Semantics): VarScopedDeclarations
- Block の VarScopedDeclarations を返す
13.15.7 ランタイムセマンティクス(Runtime Semantics): CatchClauseEvaluation
引数 thrownValue を使用。
- 実行中の実行コンテキスト の LexicalEnvironment を oldEnv とする
- NewDeclarativeEnvironment(oldEnv) を catchEnv とする
- catchEnv の EnvironmentRecord を catchEnvRec とする
- CatchParameter の BoundNames の 各要素を argName とし、argName ごとに次を実行する
- ! catchEnvRec.CreateMutableBinding(argName, false) を実行する
- catchEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- 引数 thrownValue と catchEnv を使用して CatchParameter の BindingInitialization を status とする
- status が 突然の完了 なら、
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- Completion(status) を返す
- Block の評価結果を B とする
- oldEnv を 実行中の実行コンテキスト の LexicalEnvironment にセットする
- Completion(B) を返す
- Block の 評価結果を返す
13.15.8 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- Block の評価結果を B とする
- B.[[Type]] が throw なら、 引数 B.[[Value]] を使用して Catch の CatchClauseEvaluation を C とする
- 2. と異なるなら、 B を C とする
- Completion( UpdateEmpty(C, undefined)) を返す
- Block の評価結果を B とする
- Finally の評価結果を F とする
- F.[[Type]] が normal なら、 B を F にセットする
- Completion( UpdateEmpty(F, undefined)) を返す
- Block の評価結果を B とする
- B.[[Type]] が throw なら、引数 B.[[Value]] を使用して Catch の CatchClauseEvaluation を C とする
- 10. と異なるなら、 B を C とする
- Finally の評価結果を F とする
- F.[[Type]] が normal なら、 C を F にセットする
- Completion( UpdateEmpty(F, undefined)) を返す
13.16 debuggerステートメント(The debugger Statement)
構文:
13.16.1 ランタイムセマンティクス:評価(Runtime Semantics: Evaluation)
- 実装定義のデバッグ機能が利用可能で有効になっているなら、
- 実装定義のデバッグアクションを実行する
- 実装定義の Completion 値を result とする
- 1. と異なるなら、
- NormalCompletion(empty) を result とする
- result を返す