本頁の目次 目次

12 文 (Statements)

Syntax
Statement :
Block
VariableStatement
EmptyStatement
ExpressionStatement
IfStatement
IterationStatement
ContinueStatement
BreakStatement
ReturnStatement
WithStatement
LabelledStatement
SwitchStatement
ThrowStatement
TryStatement
Semantics

Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。

12.1 ブロック (Block)

Syntax
Block :
{ StatementListopt }
StatementList :
Statement
StatementList Statement
Semantics

生成規則 Block : { } は、次のように評価される:

  1. (normal, empty, empty) を返す。

生成規則 Block : { StatementList } は、次のように評価される:

  1. StatementList を評価。
  2. Result(1) を返す。

生成規則 StatementList : Statement は、次のように評価される:

  1. Statement を評価。
  2. 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
  3. Result(1) を返す。

生成規則 StatementList : StatementList Statement は、次のように評価される:

  1. StatementList を評価。
  2. Result(1) が中途完了であれば、 Result(1) を返す。
  3. Statement を評価。
  4. 例外が投げられたら、(throw, V, empty) を返す。 V は例外である。 (ここでは例外が返されないかのように実行は進行する。)
  5. Result(3).value が empty であれば、 V = Result(1).value とし、そうでなければ V = Result(3).value とする。
  6. (Result(3).type, V, Result(3).target) を返す。

12.2 変数文 (Variable statement)

Syntax
VariableStatement :
var VariableDeclarationList ;
VariableDeclarationList :
VariableDeclaration
VariableDeclarationList , VariableDeclaration
VariableDeclarationListNoIn :
VariableDeclarationNoIn
VariableDeclarationListNoIn , VariableDeclarationNoIn
VariableDeclaration :
Identifier Initialiseropt
VariableDeclarationNoIn :
Identifier InitialiserNoInopt
Initialiser :
= AssignmentExpression
InitialiserNoIn :
= AssignmentExpressionNoIn
Description

FunctionDeclaration 内部で変数文が発生するならば、その変数は、セクション 10.1.3 にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、セクション10.1.3 にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。

Semantics

生成規則 VariableStatement : var VariableDeclarationList ; は、次のように評価される:

  1. VariableDeclarationList を評価。
  2. (normal, empty, empty) を返す。

生成規則 VariableDeclarationList : VariableDeclaration は、次のように評価される:

  1. VariableDeclaration を評価。

生成規則 VariableDeclarationList : VariableDeclarationList , VariableDeclaration は、次のように評価される:

  1. VariableDeclarationList を評価。
  2. VariableDeclaration を評価。

生成規則 VariableDeclaration : Identifier は、次のように評価される:

  1. Identifier と同じ文字シーケンスで構成される文字列値を返す。

生成規則 VariableDeclaration : Identifier Initialiser は、次のように評価される:

  1. セクション 11.1.2 にあるように Identifier を評価。
  2. Initialiser を評価。
  3. GetValue(Result(2)) を呼出す。
  4. PutValue(Result(1), Result(3)) を呼出す。
  5. Identifier と同じ文字シーケンスで構成される文字列値を返す。

生成規則 Initialiser : = AssignmentExpression は、次のように評価される:

  1. AssignmentExpression を評価。
  2. Result(1) を返す。

生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。

12.3 空文 (Empty Statement)

Syntax
EmptyStatement :
;
Semantics

生成規則 EmptyStatement : ; は、次のように評価される:

  1. (normal, empty, empty) を返す。

12.4 式文 (Expression Statement)

Syntax
ExpressionStatement :
[lookahead ∉ {{, function} ] Expression ;

Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。

Semantics

生成規則 ExpressionStatement : [lookahead ∉ {{, function}] Expression ; は、次のように評価される:

  1. Expression を評価する。
  2. GetValue(Result(1)) を呼出す。
  3. (normal, Result(2), empty) を返す。

12.5 if 文 (The if Statement)

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

関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。

Semantics

生成規則 IfStatement : if ( Expression ) Statement else Statement は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が false ならば、ステップ 7 へ。
  5. 最初の Statement を評価。
  6. Result(5) を返す。
  7. 2 番目の Statement を評価。
  8. Result(7) を返す。

生成規則 IfStatement : if ( Expression ) Statement は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToBoolean(Result(2)) を呼出す。
  4. Result(3) が false ならば、 (normal, empty, empty) を返す。
  5. Result(3) が false ならば、 (normal, empty, empty) を返す。
  6. Statement を評価。
  7. Result(5) を返す。

12.6 繰返し文 (Iteration Statements)

繰返し文は (キーワードと括弧の制御構造で構成される) ヘッダと (Statement で構成される) 本文で構成される。

Syntax
IterationStatement :
do Statement while ( Expression );
while ( Expression ) Statement
for (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statement
for ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statement
for ( LeftHandSideExpression in Expression ) Statement
for ( var VariableDeclarationNoIn in Expression ) Statement

12.6.1 do-while 文 (The do-while Statement)

生成規則 do Statement while ( Expression ); は、次のように評価される:

  1. V = empty とする。
  2. Statement を評価。
  3. Result(2).value が empty でなければ、 V = Result(2).value とする。
  4. Result(2).type が continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。
  5. Result(2).type が break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。
  6. Result(2) が中途完了ならば、 Result(2) を返す。
  7. Expression を評価。
  8. GetValue(Result(7)) を呼出す。
  9. ToBoolean(Result(8)) を呼出す。
  10. Result(9) が true ならば、ステップ 2 ヘ。
  11. (normal, V, empty) を返す。

12.6.2 while 文 (The while statement)

生成規則 IterationStatement : while ( Expression ) Statement は、次のように評価される:

  1. V = empty とする。
  2. Expression を評価。
  3. GetValue(Result(2)) を呼出す。
  4. ToBoolean(Result(3)) を呼出す。
  5. Result(4) が false ならば、 (normal, V, empty) を返す。
  6. Statement を評価。
  7. Result(6).value が empty でなければ、 V = Result(6).value とする。
  8. Result(6).type が continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。
  9. Result(6).type が break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。
  10. Result(6) が中途完了ならば、 Result(6) を返す。
  11. ステップ 2 へ。

12.6.3 for 文 (The for Statement)

生成規則 IterationStatement : for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement は、次のように評価される:

  1. ExpressionNoIn が存在しなければ、ステップ 4 へ。
  2. ExpressionNoIn を評価。
  3. GetValue(Result(2)) を呼出す。 (この値は使用しない。)
  4. V = empty とする。
  5. 最初の Expression が存在しなければ、ステップ 10 へ。
  6. 最初の Expression を評価。
  7. GetValue(Result(6)) を呼出す。
  8. ToBoolean(Result(7)) を呼出す。
  9. Result(8) が false ならば、ステップ 19 へ。
  10. Statement を評価。
  11. Result(10).value が empty でないならば、 V = Result(10).value とする。
  12. Result(10).type が break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。
  13. Result(10).type が continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。
  14. Result(10) が中途完了ならば Result(10) を返す。
  15. 2 番目の Expression が存在しなければ、ステップ 5 へ。
  16. 2 番目の Expression を評価。
  17. GetValue(Result(16) を呼出す。 (この値は使用しない。)
  18. ステップ 5 へ。
  19. (normal, V, empty) を返す。

生成規則 IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される:

  1. VariableDeclarationListNoIn を評価。
  2. V = empty とする。
  3. 1 個目の Expression が存在しないならば、 ステップ 8 へ。
  4. 1 個目の Expression を評価。
  5. GetValue(Result(4)) を呼出す。
  6. ToBoolean(Result(5)) を呼出す。
  7. Result(6) が false ならば、 ステップ 17 へ。
  8. Statement を評価。
  9. Result(8).value が空でないならば、 V = Result(8).value とする。
  10. Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。
  11. Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。
  12. Result(8) が中途完了ならば、 Result(8) を返す。
  13. 2 個目の Expression が存在しないならば、 ステップ 3 へ。
  14. 2 個目の Expression を評価。
  15. GetValue(Result(14)) を呼出す。 (この値は使用しない。)
  16. ステップ 3 へ。
  17. (normal, V, empty) を返す。

12.6.4 for-in 文 (The for-in Statement)

生成規則 IterationStatement : for ( LeftHandSideExpression in Expression ) Statement は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToObject(Result(2)) を呼出す。
  4. V = empty とする。
  5. DontEnum 属性を持たない、 Result(3) の次のプロパティの名前を取得する。そのようなプロパティが存在しないならば、 ステップ 14 へ。
  6. LeftHandSideExpression を評価 (これは繰返し評価されてよい)。
  7. PutValue(Result(6), Result(5)) を呼出す。
  8. Statement を評価。
  9. Result(8).value が empty でないならば、 V = Result(8).value とする。
  10. Result(8).type が break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。
  11. Result(8).type が continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。
  12. Result(8) が中途完了ならば、 Result(8) を返す。
  13. ステップ 5 へ。
  14. (normal, V, empty) を返す。

生成規則 IterationStatement : for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される:

  1. VariableDeclarationNoIn を評価。
  2. Expression を評価。
  3. GetValue(Result(2)) を呼出す。
  4. ToObject(Result(3)) を呼出す。
  5. V = empty とする。
  6. DontEnum 属性を持たない、 Result(4) の次のプロパティを取得する。そのようなプロパティが存在しないならば、ステップ 15 へ。
  7. それが Identifier であるかのように Result(1) を評価; 11.1.2 参照(これは繰返し評価されてよい).
  8. PutValue(Result(7), Result(6)) を呼出す。
  9. Statement を評価。
  10. Result(9).value が empty でないならば、 V = Result(9).value とする。
  11. Result(9).type が break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。
  12. Result(9).type が continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。
  13. Result(8) が中途完了ならば、 Result(8) を返す。
  14. ステップ 6 へ。
  15. (normal, V, empty) を返す。

プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。

オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。

12.7 continue 文 (The continue Statement)

Syntax
ContinueStatement :
continue [LineTerminator 無し] Identifieropt ;
Semantics

次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる:

  • プログラムが選択的 Identifier を持たない continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。
  • プログラムが選択的 Identifier を持つ continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しない

Identifier のない ContinueStatement は、次のように評価される:

  1. (continue, empty, empty) を返す。

Identifier を持つ ContinueStatement は、次のように評価される:

  1. (continue, empty, Identifier) を返す。

12.8 break 文 (The break Statement)

Syntax
BreakStatement :
break [LineTerminator 無し] Identifieropt ;
Semantics

次のいずれかが真である場合、プログラムは構文的に不正であると考えられる:

  • プログラムが選択的な Identifier を持たない break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない)
  • プログラムが選択的な Identifier を持つ break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない)

Identifier のない BreakStatement は、次のように評価される:

  1. (break, empty, empty) を返す。

Identifier のある BreakStatement は、次のように評価される:

  1. (break, empty, Identifier) を返す。

12.9 return 文 (The return Statement)

Syntax
ReturnStatement :
return [LineTerminator 無し] Expressionopt ;
Semantics

ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。

生成規則 ReturnStatement : return [no LineTerminator here] Expressionopt ; は、次のように評価される:

  1. Expression が存在しなければ (return, undefined, empty) を返す。
  2. Expression を評価。
  3. GetValue(Result(2)) を呼出す。
  4. (return, Result(3), empty) を返す。

12.10 with 文 (The with Statement)

Syntax
WithStatement :
with ( Expression ) Statement
Description

with 文は現在の実行コンテキストのスコープ連鎖の先頭に算出されたオブジェクトを追加し、この拡張されたスコープ連鎖を用いて文を実行し、スコープ連鎖を蓄積する。

Semantics

生成規則 WithStatement : with ( Expression ) Statement は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. ToObject(Result(2)) を呼出す。
  4. スコープ連鎖の先頭に Result(3) を追加。
  5. ステップ 4 から拡張されるスコープ連鎖を使用して Statement を評価。
  6. C を Result(5) とする。ステップ 5 で例外が投げられたら、 C を (throw, V, empty) とする。 V のところは例外である。(実行は例外が発生しなかったかのように進行する。)
  7. スコープ連鎖の先頭から Result(3) を取り除く。
  8. C を返す。

NOTE 埋め込まれた Statement にどのように制御が残ったとしても、通常でろうと中途完了や例外の形式であろうと、スコープチェーンには常に依然の状態が蓄積される。

12.11 switch 文 (The switch Statement)

Syntax
SwitchStatement :
switch ( Expression ) CaseBlock
CaseBlock :
{ CaseClausesopt }
{ CaseClausesopt DefaultClause CaseClausesopt }
CaseClauses :
CaseClause
CaseClauses CaseClause
CaseClause :
case Expression : StatementListopt
DefaultClause :
default : StatementListopt
Semantics

生成規則 SwitchStatement : switch ( Expression ) CaseBlock は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. CaseBlock を評価し、パラメータとして Result(2) を渡す。
  4. Result(3).type が break で Result(3).target が現在のラベルセットならば、 (normal, Result(3).value, empty) を返す。
  5. Result(3) を返す。

生成規則 CaseBlock : { CaseClausesopt } は入力パラメータ input を与えられ、次のように評価される:

  1. V = empty とする。
  2. A をソーステキスト順の CaseClause 項目のリストとする。
  3. C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
  4. C を評価する。
  5. input が !-- 演算子で定義されるように等しくなければ、 ステップ 3 へ。
  6. C が StatementList を持たなければ、ステップ 10 へ。
  7. C の StatementList を評価し、 R をその結果とする。
  8. R が中途完了ならば、 R を返す。
  9. V = R.value とする。
  10. C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
  11. C が StatementList を持たなければ、ステップ 10 へ。
  12. C の StatementList を評価し、 R をその結果とする。
  13. R.value が empty でなければ、 V = R.value とする。
  14. R が中途完了ならば、 (R.type, V, R.target) を返す。
  15. ステップ 10 へ。
  16. (normal, V, empty) を返す。

生成規則 CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt } は入力パらメータ input を与えられ、次のように評価される:

  1. V = empty とする。
  2. A を 1 個目の CaseCloses 内のソーステキスト順の CaseClause 項目のリストとする。
  3. C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 11 へ。
  4. C を評価する。
  5. input が Result(4) と !== 演算子により定義されるように等しくなければ、ステップ 3 へ。
  6. C が StatementList を持たなければ、ステップ 20 へ。
  7. C の StatementList を評価し、 R をその結果とする。
  8. R が中途完了ならば、 R を返す。
  9. V = R.value とする。
  10. ステップ 20 へ。
  11. B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
  12. C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
  13. C を評価する。
  14. input が Result(13) と !== 演算子により定義されるように等しくなければ、ステップ 12 へ。
  15. C が StatementList を持たなければステップ 31 へ。
  16. C の StatementList を評価し、 R を結果とする。
  17. R が中途完了ならば R を返す。
  18. V = R.value とする。
  19. ステップ 31 へ。
  20. C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
  21. C が StatementList を持たなければ、ステップ 20 へ。
  22. C の StatementList を評価し、 R をその結果とする。
  23. R.value が empty でなければ、 V = R.value とする。
  24. R が中途完了ならば、 (R.type, V, R.target) を返す。
  25. ステップ 20 へ。
  26. DefaultClause が StatementList を持たなければ、ステップ 30 へ。
  27. DefaultClause の StatementList を評価し、 R をその結果とする。
  28. R.value が empty でなければ、 V = R.value とする。
  29. R が中途完了ならば、 (R.type, V, R.target) を返す。
  30. B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
  31. C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 37 へ。
  32. C が StatementList を持たないならば、ステップ 31 へ。
  33. C の StatementList を評価し、 R をその結果とする。
  34. R.value が empty でないならば、 V = R.value とする。
  35. R が中途完了ならば、 (R.type, V, R.target) を返す。
  36. ステップ 31 へ。
  37. (normal, V, empty) を返す。

生成規則 CaseClause : case Expression : StatementListopt は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. Result(2) を返す。

NOTE CaseClause 評価は関連 StatementList を実行しない。単純に Expression を評価し、 StatementList 実行開始判定に CaseBlock アルゴリズムが用いる値を返す。

12.12 ラベル付き文 (Labelled Statements)

Syntax
LabelledStatement :
Identifier : Statement
Semantics

Statement にラベルを先行させてよい。ラベル付き文は、ラベル付き break 及び continue 文とともに使用されるだけである。 ECMAScript は goto 文を持たない。

ECMAScript プログラムは、 LabelledStatement によってラベルと同じ Identifier で閉じられている LabelledStatement を含む場合、構文的に不正であると考えられる。これは、ラベル付けされた文中でネストされる FunctionDeclaration の本文内に直接あるいは間接的に現われるラベルには当てはまらない。

生成規則 Identifier : Statement は、 Statement のラベルセットに Identifier を追加する形で評価され、 Statement を評価する。 LabelledStatement 自身が空でないラベルセットを持つならば、それらのラベルはまたそれが評価される前に Statement のラベルセットに追加される。 L を Identifier と等しいとして Statement 評価の結果が (break, V, L) ならば、生成規則は (normal, V, empty) を結果とする。

LabelledStatement の評価に先立って、含まれる Statement は空のラベルセットを所有すると見なされるが、それが IterationStatement あるいは SwitchStatement ならば、その場合それは単一の要素 empty からなるラベルセットを所有すると見なされる。

12.13 throw 文 (The throw statement)

Syntax
ThrowStatement :
throw [LineTerminator 無し] Expression ;
Semantics

生成規則 ThrowStatement : throw [no LineTerminator here] Expression ; は、次のように評価される:

  1. Expression を評価。
  2. GetValue(Result(1)) を呼出す。
  3. (throw, Result(2), empty) を返す。

12.14 try 文 (The try statement)

Syntax
TryStatement :
try Block Catch
try Block Finally
try Block Catch Finally
Catch :
catch (Identifier ) Block
Finally :
finally Block
Description

try 文は、実行時エラーや throw 文のような例外的条件が発生するコードのブロックを囲む。 catch クローズは例外にハンドリングされるコードを提供する。 catch クローズが例外を受け取るとき、その Identifier は発生した例外にバインドされる。

Semantics

生成規則 TryStatement : try Block Catch は、次のように評価される:

  1. Block を評価。
  2. Result(1).type が throw でなければ、 Result(1) を返す。
  3. パラメータ に Result(1) を以って Catch を評価。
  4. Result(3) を返す。

生成規則 TryStatement : try Block Finally は、次のように評価される:

  1. Block を評価。
  2. Finally を評価。
  3. Result(2).type が normal ならば、 Result(1) を返す。
  4. Result(2) を返す。

生成規則 TryStatement : try Block Catch Finally は、次のように評価される:

  1. Block を評価。
  2. C = Result(1) とする。
  3. Result(1).type が throw でなければ、ステップ 6 へ。
  4. パラメータ に Result(1) を以って Catch を評価。
  5. C = Result(4) とする。
  6. Finally を評価。
  7. Result(6).type が normal ならば、 C を返す。
  8. Result(6) を返す。

生成規則 Catch : catch ( Identifier ) Block は、次のように評価される:

  1. C をこの生成規則に渡されているパラメータとする。
  2. 式 new Object() によるものであるかのように、新しいオブジェクトを生成する。
  3. Result(2) にプロパティを作成する。プロパティ名は Identifier, 値は C.value, 属性は { DontDelete } である。
  4. スコープ連鎖の先頭に Result(2) を追加。
  5. Block を評価。
  6. スコープ連鎖の先頭から Result(2) を取り除く。
  7. Result(5) を返す。

生成規則 Finally : finally Block は、次のように評価される:

  1. Block を評価。
  2. Result(1) を返す。

Page Contents

Issued: / Revised: / All rights reserved. © 2002-2016 TAKI