ページ表示設定

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: Evaluation

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: Evaluation

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
          ホストが Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、
          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
        ホストが Web ブラウザーであるか、その他の方法で ブロックレベル関数宣言の Web Legacy 互換性意味論 をサポートする場合、
        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 宣言と変数文

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: Evaluation

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 変数文

注

var 文は、実行中の実行コンテキストの VariableEnvironment をスコープとする変数を宣言します。var 変数は、それを含む Environment Record がインスタンス化されるときに作成され、作成時に undefined で初期化されます。任意の VariableEnvironment のスコープ内で、同じ BindingIdentifier が複数の VariableDeclaration に現れてもかまいませんが、それらの宣言全体で定義される変数は1つだけです。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: Evaluation

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レコード または undefined))。戻り値:(正常完了 (値:リスト (要素:プロパティキー)) または 中途完了)。 束縛されたすべてのプロパティ名のリストを収集します。 次の生成規則ごとに定義される。

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レコード または undefined)) および excludedNames (リスト (要素:プロパティキー))。戻り値:(正常完了 (値: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レコード または undefined)) および propertyName (プロパティキー)。戻り値:(正常完了 (値:unused) または 中途完了)。

注

envRecord に undefined が渡された場合、初期化値の代入に PutValue 操作を使用するべきであることを示します。これは非 strict 関数の仮引数リストの場合です。その場合、同じ名前の複数の引数が存在する可能性に対応するため、仮引数の束縛は事前に初期化されます。

次の生成規則ごとに定義される。

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: Evaluation

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 は2トークン列 let [ で始めることはできません。これは、最初の LexicalBinding が ArrayBindingPattern である let LexicalDeclaration と曖昧になるためです。

14.5.1 Runtime Semantics: Evaluation

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 ≠ else] は、古典的な「dangling else」問題を通常の方法で解決します。つまり、関連付ける if の選択がそれ以外では曖昧な場合、else は候補となる if のうち最も近い(最も内側の)ものに関連付けられます。

14.6.1 Static Semantics: 早期エラー

IfStatement : if ( Expression ) Statement else Statement IfStatement : if ( Expression ) Statement 注

この規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。

14.6.2 Runtime Semantics: Evaluation

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(2番目の 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 (完了レコード) および labelSet (リスト (要素:String))。戻り値: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))。戻り値:(正常完了 (値: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))。戻り値:(正常完了 (値: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))。戻り値:(正常完了 (値: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))。戻り値:(正常完了 (値:ECMAScript 言語値) または 中途完了)。 次の生成規則ごとに定義される。

ForStatement : for ( Expressionopt ; Expressionopt ; Expressionopt ) Statement
  1. 最初の Expression が存在する場合、
    1. exprRef を最初の Expression の ? Evaluation とする。
    2. ? GetValue(exprRef) を実行する。
  2. 2番目の Expression が存在する場合、test を2番目の Expression とする。そうでない場合、test を empty とする。
  3. 3番目の Expression が存在する場合、increment を3番目の 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. 2番目の Expression が存在する場合、increment を2番目の 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. 2番目の Expression が存在する場合、increment を2番目の 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 ((an Expression Parse Node または empty))、increment ((an Expression Parse Node または empty))、stmt (a Statement Parse Node)、perIterationBindings (リスト (要素:String)) および labelSet (リスト (要素:String))。戻り値:(正常完了 (値: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))。戻り値:(正常完了 (値: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))。戻り値:(正常完了 (値: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: Evaluation

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 メソッドによって最大1回だけ返されます。

対象オブジェクトのプロパティの列挙には、そのプロトタイプ、そのプロトタイプのプロトタイプ、というように再帰的にプロトタイプのプロパティを列挙することも含まれます。ただし、プロトタイプのプロパティが、イテレーターの next メソッドによってすでに処理されたプロパティと同じ名前を持つ場合、そのプロパティは処理されません。プロトタイプオブジェクトのプロパティがすでに処理されたかどうかを判定するとき、[[Enumerable]] 属性の値は考慮されません。プロトタイプオブジェクトの列挙可能なプロパティ名は、そのプロトタイプオブジェクトを引数として渡して EnumerateObjectProperties を呼び出すことによって取得しなければなりません。EnumerateObjectProperties は、対象オブジェクトの [[OwnPropertyKeys]] 内部メソッドを呼び出して自身のプロパティキーを取得しなければなりません。対象オブジェクトのプロパティ属性は、その [[GetOwnProperty]] 内部メソッドを呼び出して取得しなければなりません。

さらに、obj も、そのプロトタイプチェーン内のいずれのオブジェクトも Proxy 特殊オブジェクト、TypedArray、Module Namespace 特殊オブジェクト、または実装提供の特殊オブジェクトでない場合、次のいずれかが発生するまで、イテレーターは 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 Iterator オブジェクト

For-In Iterator は、特定のオブジェクトに対する特定の反復を表すオブジェクトです。For-In Iterator オブジェクトは ECMAScript コードから直接アクセスされることはなく、EnumerateObjectProperties の動作を説明するためだけに存在します。

14.7.5.10.1 CreateForInIterator ( obj )

抽象操作 CreateForInIterator。引数 obj (Object)。戻り値:a For-In Iterator。 obj の自身および継承された列挙可能な文字列プロパティを特定の順序で反復する For-In Iterator オブジェクトを作成するために使用されます。 呼び出されると、次の手順を実行する。

  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 オブジェクトによって継承されるプロパティを持ちます。
  • 通常オブジェクトです。
  • 値が %Iterator.prototype% である [[Prototype]] 内部スロットを持ちます。
  • ECMAScript コードから直接アクセスされることはありません。
  • 次のプロパティを持ちます。

14.7.5.10.2.1 %ForInIteratorPrototype%.next ( )

  1. iterator を this 値とする。
  2. 表明: iterator は Object である。
  3. 表明: iterator は For-In Iterator インスタンスのすべての内部スロット(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 Iterator インスタンスのプロパティ

For-In Iterator インスタンスは、%ForInIteratorPrototype% イントリンシックオブジェクトからプロパティを継承する通常オブジェクトです。For-In Iterator インスタンスは、初期状態では 表 34 に列挙される内部スロットを持つように作成されます。

表 34: For-In Iterator インスタンスの内部スロット
内部スロット 型 説明
[[Object]] an Object プロパティが反復されている Object 値です。
[[ObjectWasVisited]] a Boolean イテレーターが [[Object]] に対して [[OwnPropertyKeys]] を呼び出している場合は true、それ以外の場合は false です。
[[VisitedKeys]] a List of Strings このイテレーターがこれまでに出力した値です。
[[RemainingKeys]] a List of Strings そのプロトタイプが 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: Evaluation

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: Evaluation

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: Evaluation

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 文を使用することは推奨されません。分割代入など、strict モードコードと非 strict コードの両方で許可される代替手段を検討してください。

構文

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 注

2番目の規則を適用する必要があるのは、B.3.1 で規定される拡張が実装されている場合だけです。

14.11.2 Runtime Semantics: Evaluation

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. 2番目の CaseClauses が存在する場合、
    1. secondCaseClauses を、ソーステキスト順の2番目の 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. 注記: 次は2番目の CaseClauses のもう1回の完全な反復である。
  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 (a 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: Evaluation

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 (a 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: Evaluation

LabelledStatement : LabelIdentifier : LabelledItem
  1. 引数 « » を指定したこの LabelledStatement の ? LabelledEvaluation を返す。

14.13.4 Runtime Semantics: LabelledEvaluation

構文指向操作 LabelledEvaluation。引数 labelSet (リスト (要素:String))。戻り値:(正常完了 (値:(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 の2つだけです。

14.14 throw 文

構文

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

14.14.1 Runtime Semantics: Evaluation

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: Evaluation

TryStatement : try Block Catch
  1. blockResult を Completion(Block の Evaluation) とする。
  2. blockResult がスロー完了である場合、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 がスロー完了である場合、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: Evaluation

注

DebuggerStatement を評価すると、デバッガーの下で実行されている場合、実装がブレークポイントを発生させることができる場合があります。デバッガーが存在しないか、アクティブでない場合、この文には観測可能な効果はありません。

DebuggerStatement : debugger ;
  1. 実装定義のデバッグ機能が利用可能で有効になっている場合、
    1. 実装定義のデバッグ動作を実行する。
    2. 新しい実装定義の Completion Record を返す。
  2. empty を返す。