本頁の目次 目次 次頁: 13_Function_Definition 前頁: 11_Expressions
Statement は LabelledStatement の一部となりうるし、それ自身が LabelledStatement の一部であってもよく、以下同様である。この方法でつけられたラベルは、個々の文の意味論記述において "現在のラベルセット (current label set)" として併せて参照される。 LabelledStatement はラベルセットへのラベルの導入以外の意味論を持たない。 IterationStatement または SwitchStatement のラベルセットは最初は単一の要素 empty で構成される。任意の他の文のラベルセットは初期は empty である。
生成規則 Block : { } は、次のように評価される:
生成規則 Block : { StatementList } は、次のように評価される:
生成規則 StatementList : Statement は、次のように評価される:
生成規則 StatementList : StatementList Statement は、次のように評価される:
var VariableDeclarationList ;FunctionDeclaration 内部で変数文が発生するならば、その変数は、セクション 10.1.3 にあるように、その関数内の関数ローカルスコープで定義される。そうでないならば、それらはプロパティ属性 { DontDelete } のグローバルスコープで定義される(つまり、セクション10.1.3 にあるグローバルオブジェクトのメンバとして作成される)。変数は実行スコープに入ったときに生成される。 Block は新しい実行スコープを定義しない。 Program と FunctionDeclaration だけが新しいスコープを生成する。生成時、変数は undefined で初期化される。イニシャライザを持つ変数が AssignmentExpression の値を代入されるのは VariableStatement が実行されるときであり、変数が生成されたときではない。
生成規則 VariableStatement : var VariableDeclarationList ; は、次のように評価される:
生成規則 VariableDeclarationList : VariableDeclaration は、次のように評価される:
生成規則 VariableDeclarationList : VariableDeclarationList , VariableDeclaration は、次のように評価される:
生成規則 VariableDeclaration : Identifier は、次のように評価される:
生成規則 VariableDeclaration : Identifier Initialiser は、次のように評価される:
生成規則 Initialiser : = AssignmentExpression は、次のように評価される:
生成規則 VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn は、生成規則 VariableDeclarationList, VariableDeclaration, Initialiser と同様に評価されるが、 VariableDeclarationList, VariableDeclaration, Initialiser, AssignmentExpression の代わりに、それぞれ VariableDeclarationListNoIn, VariableDeclarationNoIn, InitialiserNoIn, AssignmentExpressionNoIn が評価される。
生成規則 EmptyStatement : ; は、次のように評価される:
function} ] Expression ;Block と曖昧になることから、 ExpressionStatement は大括弧 "{" で開始することはできないことに注意。また、 FunctionDeclaration と曖昧になることから、 ExpressionStatement は function キーワードで開始することもできない。
生成規則 ExpressionStatement : [lookahead ∉ {{, function}] Expression ; は、次のように評価される:
if ( Expression ) Statement else Statementif ( Expression ) Statement関連する if の選択が曖昧な else は、可能な限り最も近い、関連しなければ該当する else がないような if にそれぞれ関連している。
生成規則 IfStatement : if ( Expression ) Statement else Statement は、次のように評価される:
生成規則 IfStatement : if ( Expression ) Statement は、次のように評価される:
繰返し文は (キーワードと括弧の制御構造で構成される) ヘッダと (Statement で構成される) 本文で構成される。
do Statement while ( Expression );while ( Expression ) Statementfor (ExpressionNoInopt; Expressionopt ; Expressionopt ) Statementfor ( var VariableDeclarationListNoIn; Expressionopt ; Expressionopt ) Statementfor ( LeftHandSideExpression in Expression ) Statementfor ( var VariableDeclarationNoIn in Expression ) Statement生成規則 do Statement while ( Expression ); は、次のように評価される:
continue で、かつ Result(2).target が現在のラベルセット内にあれば、ステップ 7 へ。break で、かつ Result(2).target が現在のラベルセット内にあれば、 (normal, V, empty) を返す。生成規則 IterationStatement : while ( Expression ) Statement は、次のように評価される:
continue かつ Result(6).target が現在のラベルセットならば、ステップ 2 へ。break かつ Result(6).target が現在のラベルセットならば、 (normal, V, empty) を返す。生成規則 IterationStatement : for (ExpressionNoInopt ; Expressionopt ; Expressionopt) Statement は、次のように評価される:
break かつ Result(10).target が現在のラベルセットならば、ステップ 19 へ。continue かつ Result(10).target が現在のラベルセットならば、ステップ 15 へ。生成規則 IterationStatement : for ( var VariableDeclarationListNoIn ; Expressionopt ; Expressionopt ) Statement は、次のように評価される:
break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 17 へ。continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 13 へ。生成規則 IterationStatement : for ( LeftHandSideExpression in Expression ) Statement は、次のように評価される:
break かつ Result(8).target が現在のラベルセット内ならば、 ステップ 14 へ。continue かつ Result(8).target が現在のラベルセット内ならば、 ステップ 5 へ。生成規則 IterationStatement : for ( var VariableDeclarationNoIn in Expression ) Statement は、次のように評価される:
break かつ Result(9).target が現在のラベルセット内ならば、 ステップ 15 へ。continue かつ Result(9).target が現在のラベルセット内ならば、 ステップ 6 へ。プロパティの列挙方法 (1 個目のアルゴリズムのステップ 5, 2 個目のステップ 6) は実装依存である。列挙の順序はオブジェクトにより定義される。列挙されているオブジェクトのプロパティは列挙中に削除されてもよい。列挙中まだ挙げられていないプロパティが削除されるならば、そのプロパティは列挙されない。列挙中オブジェクトに新しいプロパティが追加されるならば、新たに追加されたプロパティは現在の列挙において挙げられることを保証されない。
オブジェクトのプロパティ列挙は、そのプロトタイプのプロパティ、プロトタイプのプロトタイプのプロパティ、以下同様に再帰的にプロパティを含む; しかし、同名のプロパティを持つプロトタイプチェーン内の前のオブジェクトにより "隠される" ならば、プロトタイプのプロパティは列挙されない。
continue [LineTerminator 無し] Identifieropt ;次のいずれかが真であるとき、プログラムは構文的に不正であると考えられる:
continue 宣言で構成されていて、直接または間接的に(関数の区切りにまたがらない)、 IterationStatement 内にネストしなていない。continue 宣言で構成されていて、閉じた (関数の区切りにはまたがらない) IterationStatement のラベルセット内に Identifier が出現しないIdentifier のない ContinueStatement は、次のように評価される:
Identifier を持つ ContinueStatement は、次のように評価される:
break [LineTerminator 無し] Identifieropt ;次のいずれかが真である場合、プログラムは構文的に不正であると考えられる:
break 文を含み、それが IterationStatement または SwitchStatement 内部で直接的または間接的にネストしていない。 (関数の境界には交わらない)break 文を含み、 Identifier が Statement を囲むラベルセット内に出現しない。 (関数の境界には交わらない)Identifier のない BreakStatement は、次のように評価される:
Identifier のある BreakStatement は、次のように評価される:
return [LineTerminator 無し] Expressionopt ;ECMAScript プログラムは、それが FunctionBody 内部\でない return 文を含む場合、構文的に不正と考えられる。return 文は、関数に実行を停止させ、値を呼出側に返させる。 Expression が省略される場合、戻り値は undefined である。そうでなければ、戻り値は Expression の値である。
生成規則 ReturnStatement : return [no LineTerminator here] Expressionopt ; は、次のように評価される:
with ( Expression ) Statementwith 文は現在の実行コンテキストのスコープ連鎖の先頭に算出されたオブジェクトを追加し、この拡張されたスコープ連鎖を用いて文を実行し、スコープ連鎖を蓄積する。
生成規則 WithStatement : with ( Expression ) Statement は、次のように評価される:
NOTE 埋め込まれた Statement にどのように制御が残ったとしても、通常でろうと中途完了や例外の形式であろうと、スコープチェーンには常に依然の状態が蓄積される。
switch ( Expression ) CaseBlockcase Expression : StatementListoptdefault : StatementListopt生成規則 SwitchStatement : switch ( Expression ) CaseBlock は、次のように評価される:
break で Result(3).target が現在のラベルセットならば、 (normal, Result(3).value, empty) を返す。生成規則 CaseBlock : { CaseClausesopt } は入力パラメータ input を与えられ、次のように評価される:
生成規則 CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt } は入力パらメータ input を与えられ、次のように評価される:
生成規則 CaseClause : case Expression : StatementListopt は、次のように評価される:
NOTE CaseClause 評価は関連 StatementList を実行しない。単純に Expression を評価し、 StatementList 実行開始判定に CaseBlock アルゴリズムが用いる値を返す。
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 からなるラベルセットを所有すると見なされる。
throw [LineTerminator 無し] Expression ;生成規則 ThrowStatement : throw [no LineTerminator here] Expression ; は、次のように評価される:
try 文は、実行時エラーや throw 文のような例外的条件が発生するコードのブロックを囲む。 catch クローズは例外にハンドリングされるコードを提供する。 catch クローズが例外を受け取るとき、その Identifier は発生した例外にバインドされる。
生成規則 TryStatement : try Block Catch は、次のように評価される:
throw でなければ、 Result(1) を返す。生成規則 TryStatement : try Block Finally は、次のように評価される:
生成規則 TryStatement : try Block Catch Finally は、次のように評価される:
throw でなければ、ステップ 6 へ。生成規則 Catch : catch ( Identifier ) Block は、次のように評価される:
new Object() によるものであるかのように、新しいオブジェクトを生成する。生成規則 Finally : finally Block は、次のように評価される: