0x0b
js-grammer05
最終更新:
0x0b
-
view
12.10 with 文 (The with Statement)
Syntax
WithStatement :
with ( Expression ) Statement
Description
with 文は現在の実行コンテキストのスコープ連鎖の先頭に算出されたオブジェクトを追加し、この拡張されたスコープ連鎖を用いて文を実行し、スコープ連鎖を蓄積する。
Semantics
生成規則 WithStatement : with ( Expression ) Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToObject(Result(2)) を呼出す。
スコープ連鎖の先頭に Result(3) を追加。
ステップ 4 から拡張されるスコープ連鎖を使用して Statement を評価。
C を Result(5) とする。ステップ 5 で例外が投げられたら、 C を (throw, V, empty) とする。 V のところは例外である。(実行は例外が発生しなかったかのように進行する。)
スコープ連鎖の先頭から Result(3) を取り除く。
C を返す。
NOTE 埋め込まれた Statement にどのように制御が残ったとしても、通常でろうと中途完了や例外の形式であろうと、スコープチェーンには常に依然の状態が蓄積される。
12.11 switch 文 (The switch Statement)
WithStatement :
with ( Expression ) Statement
Description
with 文は現在の実行コンテキストのスコープ連鎖の先頭に算出されたオブジェクトを追加し、この拡張されたスコープ連鎖を用いて文を実行し、スコープ連鎖を蓄積する。
Semantics
生成規則 WithStatement : with ( Expression ) Statement は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
ToObject(Result(2)) を呼出す。
スコープ連鎖の先頭に Result(3) を追加。
ステップ 4 から拡張されるスコープ連鎖を使用して Statement を評価。
C を Result(5) とする。ステップ 5 で例外が投げられたら、 C を (throw, V, empty) とする。 V のところは例外である。(実行は例外が発生しなかったかのように進行する。)
スコープ連鎖の先頭から Result(3) を取り除く。
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 は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
CaseBlock を評価し、パラメータとして Result(2) を渡す。
Result(3).type が break で Result(3).target が現在のラベルセットならば、 (normal, Result(3).value, empty) を返す。
Result(3) を返す。
生成規則 CaseBlock : { CaseClausesopt } は入力パラメータ input を与えられ、次のように評価される:
V = empty とする。
A をソーステキスト順の CaseClause 項目のリストとする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
C を評価する。
input が !-- 演算子で定義されるように等しくなければ、 ステップ 3 へ。
C が StatementList を持たなければ、ステップ 10 へ。
C の StatementList を評価し、 R をその結果とする。
R が中途完了ならば、 R を返す。
V = R.value とする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
C が StatementList を持たなければ、ステップ 10 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 10 へ。
(normal, V, empty) を返す。
生成規則 CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt } は入力パらメータ input を与えられ、次のように評価される:
V = empty とする。
A を 1 個目の CaseCloses 内のソーステキスト順の CaseClause 項目のリストとする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 11 へ。
C を評価する。
input が Result(4) と !== 演算子により定義されるように等しくなければ、ステップ 3 へ。
C が StatementList を持たなければ、ステップ 20 へ。
C の StatementList を評価し、 R をその結果とする。
R が中途完了ならば、 R を返す。
V = R.value とする。
ステップ 20 へ。
B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
C を評価する。
input が Result(13) と !== 演算子により定義されるように等しくなければ、ステップ 12 へ。
C が StatementList を持たなければステップ 31 へ。
C の StatementList を評価し、 R を結果とする。
R が中途完了ならば R を返す。
V = R.value とする。
ステップ 31 へ。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
C が StatementList を持たなければ、ステップ 20 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 20 へ。
DefaultClause が StatementList を持たなければ、ステップ 30 へ。
DefaultClause の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 37 へ。
C が StatementList を持たないならば、ステップ 31 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でないならば、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 31 へ。
(normal, V, empty) を返す。
生成規則 CaseClause : case Expression : StatementListopt は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
Result(2) を返す。
NOTE CaseClause 評価は関連 StatementList を実行しない。単純に Expression を評価し、 StatementList 実行開始判定に CaseBlock アルゴリズムが用いる値を返す。
12.12 ラベル付き文 (Labelled Statements)
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 は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
CaseBlock を評価し、パラメータとして Result(2) を渡す。
Result(3).type が break で Result(3).target が現在のラベルセットならば、 (normal, Result(3).value, empty) を返す。
Result(3) を返す。
生成規則 CaseBlock : { CaseClausesopt } は入力パラメータ input を与えられ、次のように評価される:
V = empty とする。
A をソーステキスト順の CaseClause 項目のリストとする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
C を評価する。
input が !-- 演算子で定義されるように等しくなければ、 ステップ 3 へ。
C が StatementList を持たなければ、ステップ 10 へ。
C の StatementList を評価し、 R をその結果とする。
R が中途完了ならば、 R を返す。
V = R.value とする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 16 へ。
C が StatementList を持たなければ、ステップ 10 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 10 へ。
(normal, V, empty) を返す。
生成規則 CaseBlock : { CaseClausesopt DefaultClause CaseClausesopt } は入力パらメータ input を与えられ、次のように評価される:
V = empty とする。
A を 1 個目の CaseCloses 内のソーステキスト順の CaseClause 項目のリストとする。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 11 へ。
C を評価する。
input が Result(4) と !== 演算子により定義されるように等しくなければ、ステップ 3 へ。
C が StatementList を持たなければ、ステップ 20 へ。
C の StatementList を評価し、 R をその結果とする。
R が中途完了ならば、 R を返す。
V = R.value とする。
ステップ 20 へ。
B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
C を評価する。
input が Result(13) と !== 演算子により定義されるように等しくなければ、ステップ 12 へ。
C が StatementList を持たなければステップ 31 へ。
C の StatementList を評価し、 R を結果とする。
R が中途完了ならば R を返す。
V = R.value とする。
ステップ 31 へ。
C を A 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 26 へ。
C が StatementList を持たなければ、ステップ 20 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 20 へ。
DefaultClause が StatementList を持たなければ、ステップ 30 へ。
DefaultClause の StatementList を評価し、 R をその結果とする。
R.value が empty でなければ、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
B を 2 個目の CaseClauses 内のソーステキスト順の CaseClause 項目のリストとする。
C を B 内の次の CaseClause とする。そのような CaseClause がなければ、ステップ 37 へ。
C が StatementList を持たないならば、ステップ 31 へ。
C の StatementList を評価し、 R をその結果とする。
R.value が empty でないならば、 V = R.value とする。
R が中途完了ならば、 (R.type, V, R.target) を返す。
ステップ 31 へ。
(normal, V, empty) を返す。
生成規則 CaseClause : case Expression : StatementListopt は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
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)
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 ; は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
(throw, Result(2), empty) を返す。
12.14 try 文 (The try statement)
ThrowStatement :
throw [LineTerminator 無し] Expression ;
Semantics
生成規則 ThrowStatement : throw [no LineTerminator here] Expression ; は、次のように評価される:
Expression を評価。
GetValue(Result(1)) を呼出す。
(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 は、次のように評価される:
Block を評価。
Result(1).type が throw でなければ、 Result(1) を返す。
パラメータ に Result(1) を以って Catch を評価。
Result(3) を返す。
生成規則 TryStatement : try Block Finally は、次のように評価される:
Block を評価。
Finally を評価。
Result(2).type が normal ならば、 Result(1) を返す。
Result(2) を返す。
生成規則 TryStatement : try Block Catch Finally は、次のように評価される:
Block を評価。
C = Result(1) とする。
Result(1).type が throw でなければ、ステップ 6 へ。
パラメータ に Result(1) を以って Catch を評価。
C = Result(4) とする。
Finally を評価。
Result(6).type が normal ならば、 C を返す。
Result(6) を返す。
生成規則 Catch : catch ( Identifier ) Block は、次のように評価される:
C をこの生成規則に渡されているパラメータとする。
式 new Object() によるものであるかのように、新しいオブジェクトを生成する。
Result(2) にプロパティを作成する。プロパティ名は Identifier, 値は C.value, 属性は { DontDelete } である。
スコープ連鎖の先頭に Result(2) を追加。
Block を評価。
スコープ連鎖の先頭から Result(2) を取り除く。
Result(5) を返す。
生成規則 Finally : finally Block は、次のように評価される:
Block を評価。
Result(1) を返す
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 は、次のように評価される:
Block を評価。
Result(1).type が throw でなければ、 Result(1) を返す。
パラメータ に Result(1) を以って Catch を評価。
Result(3) を返す。
生成規則 TryStatement : try Block Finally は、次のように評価される:
Block を評価。
Finally を評価。
Result(2).type が normal ならば、 Result(1) を返す。
Result(2) を返す。
生成規則 TryStatement : try Block Catch Finally は、次のように評価される:
Block を評価。
C = Result(1) とする。
Result(1).type が throw でなければ、ステップ 6 へ。
パラメータ に Result(1) を以って Catch を評価。
C = Result(4) とする。
Finally を評価。
Result(6).type が normal ならば、 C を返す。
Result(6) を返す。
生成規則 Catch : catch ( Identifier ) Block は、次のように評価される:
C をこの生成規則に渡されているパラメータとする。
式 new Object() によるものであるかのように、新しいオブジェクトを生成する。
Result(2) にプロパティを作成する。プロパティ名は Identifier, 値は C.value, 属性は { DontDelete } である。
スコープ連鎖の先頭に Result(2) を追加。
Block を評価。
スコープ連鎖の先頭から Result(2) を取り除く。
Result(5) を返す。
生成規則 Finally : finally Block は、次のように評価される:
Block を評価。
Result(1) を返す
関数定義 (Function Definition)
Syntax
FunctionDeclaration :
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
FormalParameterList :
Identifier
FormalParameterList , Identifier
FunctionBody :
SourceElements
Semantics
生成規則 FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody } は関数宣言のために次のように処理される:
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
名前 Identifier と Result(1) の値を用いて、(セクション10.1.3 で指定される) 現在の変数オブジェクト(variable object)のプロパティを生成する。
生成規則 FunctionExpression : function ( FormalParameterListopt ) { FunctionBody } は次のように評価される:
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
Result(2) を返す。
生成規則 FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody } は次のように評価される:
式 new Object() によるものであるかのように、新しいオブジェクトを生成する。
スコープ連鎖の前に Result(1) を追加する。
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
オブジェクト Result(1) 内にプロパティを生成する。プロパティ名は Identifier で、値は Result(3)、属性は { DontDelete, ReadOnly } である。
スコープ連鎖の前から Result(1) を除去する。
Result(3) を返す。
NOTE FunctionExpression 内の Identifier は、 FunctionExpression の FunctionBody の内部から参照が可能で、関数にそれ自身の再帰的呼び出しを許可する。しかしながら、 FunctionDeclaration とは異なり、 FunctionExpression 内の Identifier を参照はできず、 FunctionExpression を閉じるスコープに影響しない。
生成規則 FunctionBody : SourceElements は次のように評価される:
関数宣言のために SourceElements を処理する。
SourceElements を評価する。
Result(2) を返す。
13.1 定義 (Definitions)
FunctionDeclaration :
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
FormalParameterList :
Identifier
FormalParameterList , Identifier
FunctionBody :
SourceElements
Semantics
生成規則 FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody } は関数宣言のために次のように処理される:
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
名前 Identifier と Result(1) の値を用いて、(セクション10.1.3 で指定される) 現在の変数オブジェクト(variable object)のプロパティを生成する。
生成規則 FunctionExpression : function ( FormalParameterListopt ) { FunctionBody } は次のように評価される:
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
Result(2) を返す。
生成規則 FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody } は次のように評価される:
式 new Object() によるものであるかのように、新しいオブジェクトを生成する。
スコープ連鎖の前に Result(1) を追加する。
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
オブジェクト Result(1) 内にプロパティを生成する。プロパティ名は Identifier で、値は Result(3)、属性は { DontDelete, ReadOnly } である。
スコープ連鎖の前から Result(1) を除去する。
Result(3) を返す。
NOTE FunctionExpression 内の Identifier は、 FunctionExpression の FunctionBody の内部から参照が可能で、関数にそれ自身の再帰的呼び出しを許可する。しかしながら、 FunctionDeclaration とは異なり、 FunctionExpression 内の Identifier を参照はできず、 FunctionExpression を閉じるスコープに影響しない。
生成規則 FunctionBody : SourceElements は次のように評価される:
関数宣言のために SourceElements を処理する。
SourceElements を評価する。
Result(2) を返す。
13.1 定義 (Definitions)
関数オブジェクト生成の処理を述べるため、2 つの定義を要する:
13.1.1 等しい文法の生成規則 (Equated Grammar Productions)
13.1.1 等しい文法の生成規則 (Equated Grammar Productions)
FunctionBody 文法生成規則を用いる 2 者は、次のうちの一つが真であるとき、等しいものであると定義される:
双方が、同じ ECMAScript プログラムのソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストはグローバルコードから構成され、セクション 10.1.2 の定義に従って、あるものはファンクションコードを含む。
双方が、同じ eval 呼び出し(15.1.2.1) のソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストは eval コードから構成され、セクション 10.1.2 の定義に従って、あるものはファンクションコードを含む。
NOTE Function コンストラクタ呼び出し(15.3.1, 15.3.2) から取得される FunctionBody を用いる 2 者は、けして等しいとはみなされない。2 つの異なる eval 呼び出しから取得される FunctionBody を用いる 2 者も、それが同じ引数を渡されていたとしても、等しいとはみなされない。
13.1.2 結合オブジェクト (Joined Objects)
双方が、同じ ECMAScript プログラムのソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストはグローバルコードから構成され、セクション 10.1.2 の定義に従って、あるものはファンクションコードを含む。
双方が、同じ eval 呼び出し(15.1.2.1) のソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストは eval コードから構成され、セクション 10.1.2 の定義に従って、あるものはファンクションコードを含む。
NOTE Function コンストラクタ呼び出し(15.3.1, 15.3.2) から取得される FunctionBody を用いる 2 者は、けして等しいとはみなされない。2 つの異なる eval 呼び出しから取得される FunctionBody を用いる 2 者も、それが同じ引数を渡されていたとしても、等しいとはみなされない。
13.1.2 結合オブジェクト (Joined Objects)
2 つ以上の Function オブジェクトが結合しているとき、それらは次の特殊な振る舞いを持つ:
オブジェクト O の非内部プロパティが作成または設定される時は、O に結合した全オブジェクトの該当するプロパティが常に直ちに作成され、同じ値および属性を設定される。
オブジェクト O の非内部プロパティが削除される時は、 O に結合した全オブジェクトの該当するプロパティも常に直ちに削除される。
オブジェクト O と P が結合していれば、それらは互いに == および === として比較する。
結合は過渡的で対称である。その結果、オブジェクト O および P が結合し、オブジェクト P および Q が結合する場合、オブジェクト O および Q も自動的に結合する。
NOTE 互いに結合した 2 つ以上のオブジェクトは、それらが異なる内部プロパティを持っているかもしれない点を除いて、事実上判別できない。本仕様において異なってもよいような内部プロパティこそが Scope である。結合されたオブジェクトは、正確な仕様技術用の道具としてこの標準の中で使用される。それは、実際の Function オブジェクトの実装法のガイドラインに使用されることを意図しない。もっと言えば、実際に実装は、2 つ以上の結合された Function オブジェクトの Scope プロパティの差が外部的に観測されず、その場合結合された Function オブジェクトの組を作らずに同じ Function オブジェクトを再使用するという時を検知するかもしれない。この標準は単に ECMAScript プログラムにみられる振る舞いの仕様であるので、これは合法的な最適化である。
13.2 Function オブジェクトの生成 (Creating Function Objects)
オブジェクト O の非内部プロパティが作成または設定される時は、O に結合した全オブジェクトの該当するプロパティが常に直ちに作成され、同じ値および属性を設定される。
オブジェクト O の非内部プロパティが削除される時は、 O に結合した全オブジェクトの該当するプロパティも常に直ちに削除される。
オブジェクト O と P が結合していれば、それらは互いに == および === として比較する。
結合は過渡的で対称である。その結果、オブジェクト O および P が結合し、オブジェクト P および Q が結合する場合、オブジェクト O および Q も自動的に結合する。
NOTE 互いに結合した 2 つ以上のオブジェクトは、それらが異なる内部プロパティを持っているかもしれない点を除いて、事実上判別できない。本仕様において異なってもよいような内部プロパティこそが Scope である。結合されたオブジェクトは、正確な仕様技術用の道具としてこの標準の中で使用される。それは、実際の Function オブジェクトの実装法のガイドラインに使用されることを意図しない。もっと言えば、実際に実装は、2 つ以上の結合された Function オブジェクトの Scope プロパティの差が外部的に観測されず、その場合結合された Function オブジェクトの組を作らずに同じ Function オブジェクトを再使用するという時を検知するかもしれない。この標準は単に ECMAScript プログラムにみられる振る舞いの仕様であるので、これは合法的な最適化である。
13.2 Function オブジェクトの生成 (Creating Function Objects)
FormalParameterList で指定される選択的なパラメータのリスト、FunctionBody で指定される本文、Scope で指定されるスコープ連鎖を与えられ、Function オブジェクトは次のように生成される:
このセクションのアルゴリズムのこれまでの呼び出しで生成されるオブジェクト E がすでに存在している場合、そしてその、このセクションのアルゴリズムの呼び出しが、今回与えられた FunctionBody と等しい FunctionBody を与えられた場合は、ステップ 13 へ。(これらの判定基準を満たす一つ以上のオブジェクト E が存在するならば、実装の裁量の一つを選択する)
新しい ECMAScript オブジェクトを生成し、 F をそのオブジェクトとする。
F の Class プロパティを "Function" に設定する。
F の Prototype プロパティを、セクション 15.3.3.1 に定義する、オリジナルの Function prototype オブジェクトに設定する。
F の Call プロパティを、セクション 13.2.1 に述べるように設定する。
F の Construct プロパティを、セクション 13.2.2 に述べるように設定する。
F の Scope プロパティを、 Scope と同じオブジェクトで構成される新しいスコープ連鎖(10.1.4) に設定する。
F の length プロパティを、FormalParameterList に指定される形式的プロパティの数に設定する。パラメータが指定されなければ、F の length プロパティを 0 に設定する。このプロパティは、セクション 15.3.5.1 に定義される属性を与えられる。
式 new Object() により生成されるかのように、新しいオブジェクトを生成する。
Result(9) の constructor プロパティを F に設定する。このプロパティは 属性 { DontEnum } を与えられる。
F の prototype プロパティを Result(9) に設定する。このプロパティは、セクション 15.3.5.2 で定義される属性を与えられる。
F を返す。
実装の裁量で、ステップ 2 またはステップ 14 へ。
E に連結される、新しい Native ECMAScript オブジェクトを生成し、F をそのオブジェクトとする。全ての非内部プロパティが E と F で一致するように、全ての非内部プロパティとその属性を E から F へ複写する。
F の Class プロパティを "Function" に設定する。
F の Prototype プロパティを、セクション 15.3.3.1 で定義するオリジナルの Function prototype オブジェクトに設定する。
F の Call プロパティを、セクション 13.2.1 で述べるように設定する。
F の Construct プロパティを、セクション 13.2.2 で述べるように設定する。
F の Scope プロパティを、Scope と同じオブジェクトで構成されるむ新しいスコープ連鎖(10.1.4) に設定する。
F を返す。
NOTE prototype プロパティは、各関数に自動的に生成され、関数がコンストラクタとして利用される可能性を許可する。
ステップ 1 は実装に、B が A に依存しないところの入れ子の関数 B を持つ関数 A の一般的なケースの最適化を許可する。このケースでは実装は B のために A が呼出される度に毎回新しいものを生成する代わりに同じオブジェクトの再利用を許可される。ステップ 13 はこの最適化を選択的にする; これを実装しないことを選択する実装は、ステップ 2 に進む。
例えば、このコード:
function A() {
このセクションのアルゴリズムのこれまでの呼び出しで生成されるオブジェクト E がすでに存在している場合、そしてその、このセクションのアルゴリズムの呼び出しが、今回与えられた FunctionBody と等しい FunctionBody を与えられた場合は、ステップ 13 へ。(これらの判定基準を満たす一つ以上のオブジェクト E が存在するならば、実装の裁量の一つを選択する)
新しい ECMAScript オブジェクトを生成し、 F をそのオブジェクトとする。
F の Class プロパティを "Function" に設定する。
F の Prototype プロパティを、セクション 15.3.3.1 に定義する、オリジナルの Function prototype オブジェクトに設定する。
F の Call プロパティを、セクション 13.2.1 に述べるように設定する。
F の Construct プロパティを、セクション 13.2.2 に述べるように設定する。
F の Scope プロパティを、 Scope と同じオブジェクトで構成される新しいスコープ連鎖(10.1.4) に設定する。
F の length プロパティを、FormalParameterList に指定される形式的プロパティの数に設定する。パラメータが指定されなければ、F の length プロパティを 0 に設定する。このプロパティは、セクション 15.3.5.1 に定義される属性を与えられる。
式 new Object() により生成されるかのように、新しいオブジェクトを生成する。
Result(9) の constructor プロパティを F に設定する。このプロパティは 属性 { DontEnum } を与えられる。
F の prototype プロパティを Result(9) に設定する。このプロパティは、セクション 15.3.5.2 で定義される属性を与えられる。
F を返す。
実装の裁量で、ステップ 2 またはステップ 14 へ。
E に連結される、新しい Native ECMAScript オブジェクトを生成し、F をそのオブジェクトとする。全ての非内部プロパティが E と F で一致するように、全ての非内部プロパティとその属性を E から F へ複写する。
F の Class プロパティを "Function" に設定する。
F の Prototype プロパティを、セクション 15.3.3.1 で定義するオリジナルの Function prototype オブジェクトに設定する。
F の Call プロパティを、セクション 13.2.1 で述べるように設定する。
F の Construct プロパティを、セクション 13.2.2 で述べるように設定する。
F の Scope プロパティを、Scope と同じオブジェクトで構成されるむ新しいスコープ連鎖(10.1.4) に設定する。
F を返す。
NOTE prototype プロパティは、各関数に自動的に生成され、関数がコンストラクタとして利用される可能性を許可する。
ステップ 1 は実装に、B が A に依存しないところの入れ子の関数 B を持つ関数 A の一般的なケースの最適化を許可する。このケースでは実装は B のために A が呼出される度に毎回新しいものを生成する代わりに同じオブジェクトの再利用を許可される。ステップ 13 はこの最適化を選択的にする; これを実装しないことを選択する実装は、ステップ 2 に進む。
例えば、このコード:
function A() {
function B(x) {return x*x;} return B;
}
function C() {
return eval("(function (x) {return x*x;})");
}
var b1 = A();
var b2 = A();
function b3(x) {return x*x;}
function b4(x) {return x*x;}
var b5 = C();
var b6 = C();
の中で、実装は、b1 と b2 の結合を許可される。だが要求はされない。実際、それらの Scope プロパティ間の違いを検知する方法がないので、b1 と b2 を同じオブジェクトに作成してもよい。一方、実装はソースコードの等しくない(13.1.1) b3 と b4 を結合してはならない。また実装は、2 つの異なる eval 呼び出しで生成されるためにソースコードの等しくない b5 と b6 も結合してはならない。
実際、それは、それらの Scope プロパティ間に違いが見られないことを実装が証明でき、それで 1 つのオブジェクトを再使用できる時にのみ、2 つの Function オブジェクトの結合に生産的だろう。このポリシーに従うことによって、実装は、それ自体に結合しているオブジェクトの空虚なケースに遭遇するだけになる。
13.2.1 Call
var b2 = A();
function b3(x) {return x*x;}
function b4(x) {return x*x;}
var b5 = C();
var b6 = C();
の中で、実装は、b1 と b2 の結合を許可される。だが要求はされない。実際、それらの Scope プロパティ間の違いを検知する方法がないので、b1 と b2 を同じオブジェクトに作成してもよい。一方、実装はソースコードの等しくない(13.1.1) b3 と b4 を結合してはならない。また実装は、2 つの異なる eval 呼び出しで生成されるためにソースコードの等しくない b5 と b6 も結合してはならない。
実際、それは、それらの Scope プロパティ間に違いが見られないことを実装が証明でき、それで 1 つのオブジェクトを再使用できる時にのみ、2 つの Function オブジェクトの結合に生産的だろう。このポリシーに従うことによって、実装は、それ自体に結合しているオブジェクトの空虚なケースに遭遇するだけになる。
13.2.1 Call
Function オブジェクト F の Call プロパティが呼出されるとき、次のステップが取られる:
F の FormalParameterList を用いる、新しい実行コンテキストを設置し、引数リストとセクション 10.2.3 で述べる this 値を渡す。
F の FunctionBody を評価する。
前の実行コンテキストを回復し、ステップ 1 で設置した実行コンテキストを出る。
Result(2).type が throw ならば、Result(2).value を投げる。
Result(2).type が ならば、Result(2) を返す。value を返す。
(Result(2).type must be normal.) undefined を返す。
13.2.2 Construct
F の FormalParameterList を用いる、新しい実行コンテキストを設置し、引数リストとセクション 10.2.3 で述べる this 値を渡す。
F の FunctionBody を評価する。
前の実行コンテキストを回復し、ステップ 1 で設置した実行コンテキストを出る。
Result(2).type が throw ならば、Result(2).value を投げる。
Result(2).type が ならば、Result(2) を返す。value を返す。
(Result(2).type must be normal.) undefined を返す。
13.2.2 Construct
Function オブジェクト F の Construct プロパティが呼出されるとき、次のステップが取られる:
新しい Native ECMAScript オブジェクトを生成する。
Result(1) の Class プロパティを "Object" に設定する。
F の prototype プロパティの値を取得する。
Result(3) がオブジェクトならば、Result(1) の Prototype プロパティを Result(3) に設定する。
Result(3) がオブジェクトでなければ、Result(1) の Prototype プロパティを、セクション 15.2.3.1 で述べるオリジナルの Object prototype オブジェクトに設定する。
F の Call プロパティを呼び出す。Result(1) を this 値として提供し、引数値として Construct に渡された引数リストを提供する。
Type(Result(6)) が Object ならば、Result(6) を返す。
Result(1) を返す。
新しい Native ECMAScript オブジェクトを生成する。
Result(1) の Class プロパティを "Object" に設定する。
F の prototype プロパティの値を取得する。
Result(3) がオブジェクトならば、Result(1) の Prototype プロパティを Result(3) に設定する。
Result(3) がオブジェクトでなければ、Result(1) の Prototype プロパティを、セクション 15.2.3.1 で述べるオリジナルの Object prototype オブジェクトに設定する。
F の Call プロパティを呼び出す。Result(1) を this 値として提供し、引数値として Construct に渡された引数リストを提供する。
Type(Result(6)) が Object ならば、Result(6) を返す。
Result(1) を返す。
プログラム (Program)
Syntax
Program :
SourceElements
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
Semantics
生成規則 Program : SourceElements は次のように評価される:
関数宣言のために SourceElements を処理する。
SourceElements を評価する。
Result(2) を返す。
生成規則 SourceElements : SourceElement は関数宣言のためには次のように処理される:
関数宣言のための SourceElement を処理する。
生成規則 SourceElements : SourceElement は次のように評価される:
SourceElement を評価する。
Result(1) を返す。
生成規則 SourceElements : SourceElements SourceElement は関数宣言のためには次のように処理される:
関数宣言のために SourceElements を処理する。
関数宣言のために SourceElement を処理する。
生成規則 SourceElements : SourceElements SourceElement は次のように評価される:
SourceElements を評価する。
Result(1) が中途完了ならば、 Result(1) を返す。
SourceElement を評価する。
Result(3) を返す。
生成規則 SourceElement : Statement は関数宣言のためアクション無しで処理される。
生成規則 SourceElement : Statement 次のように評価される:
Statement を評価.
Result(1) を返す。
生成規則 SourceElement : FunctionDeclaration は関数宣言のためには次のように処理される:
関数宣言のために FunctionDeclaration を処理する。(セクション 13 参照)
生成規則 SourceElement : FunctionDeclaration は次のように評価される:
(normal, empty, empty) を返す。
Program :
SourceElements
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
Semantics
生成規則 Program : SourceElements は次のように評価される:
関数宣言のために SourceElements を処理する。
SourceElements を評価する。
Result(2) を返す。
生成規則 SourceElements : SourceElement は関数宣言のためには次のように処理される:
関数宣言のための SourceElement を処理する。
生成規則 SourceElements : SourceElement は次のように評価される:
SourceElement を評価する。
Result(1) を返す。
生成規則 SourceElements : SourceElements SourceElement は関数宣言のためには次のように処理される:
関数宣言のために SourceElements を処理する。
関数宣言のために SourceElement を処理する。
生成規則 SourceElements : SourceElements SourceElement は次のように評価される:
SourceElements を評価する。
Result(1) が中途完了ならば、 Result(1) を返す。
SourceElement を評価する。
Result(3) を返す。
生成規則 SourceElement : Statement は関数宣言のためアクション無しで処理される。
生成規則 SourceElement : Statement 次のように評価される:
Statement を評価.
Result(1) を返す。
生成規則 SourceElement : FunctionDeclaration は関数宣言のためには次のように処理される:
関数宣言のために FunctionDeclaration を処理する。(セクション 13 参照)
生成規則 SourceElement : FunctionDeclaration は次のように評価される:
(normal, empty, empty) を返す。
ネイティブ ECMAScript オブジェクト (Native ECMAScript Objects)
ECMAScript プログラム実行開始時にいつでも利用可能な確実な組込みオブジェクトがある。一つは、グローバルオブジェクトであり、実行プログラムのスコープチェーンに入っている。他、グローバルオブジェクトの初期プロパティにアクセス可能である。
他に定義されなければ、 Call プロパティを持つ組込みオブジェクトの Class プロパティは "Function" であり、 Call プロパティを持たない組込みオブジェクトの Class プロパティは "Object" である。
多くの組込みオブジェクトは関数\である: それらは引数をつけて呼び出すことができる。またいくつかはコンストラクタでもある: それらは new 演算子をを伴う使用を意図されている。この仕様は、各組込み関数ごとに、関数が要求する引数とその Function オブジェクトのプロパティを記述する。各組込みコンストラクタごとに、この仕様は、そのコンストラクタの prototype オブジェクトのプロパティと、コンストラクタを呼び出す new 式によって返されるオブジェクトインスタンスのプロパティも記述する。
個々の関数の説明中で他に定義されなければ、このセクションで記述する関数またはコンストラクタが関数が要求すると定義されているよりも少ない引数を与えられた場合、その引数をそれぞれ undefined として十分な追加引数を与えられたかのように振舞う。
個々の関数の説明中で他に定義されなければ、このセクションで記述する関数またはコンストラクタが関数が許すと定義されているよりも多く引数を与えられた場合、その振る舞いは定義しない。部分的に、実装はこのケースの例外 TypeError を投げることを許される(が、必須ではない)。
組み込み関数のセットに機能を追加する実装は、既存の関数への新規パラメータ追加よりも新規関数の追加によりそれを行うことを奨励する。
各組込み関数と各組込みコンストラクタは Function prototype オブジェクトを持ち、その内部 Prototype プロパティの初期値として、式 Function.prototype (15.3.2.1) の値を持つ。
各組込み prototype オブジェクトは Object prototype オブジェクトを持ち、Object prototype オブジェクト自身以外は、その内部 Prototype プロパティの値として初期は式 Object.prototype (15.3.2.1) の値を持つ。
このセクションで記述されるどの組み込み関数も、個々の関数の記述に特に指定がない限りは、内部 Construct メソッドを実装すべきではない。このセクションで記述されるどの組み込み関数も、個々の関数の記述に特に指定がない限りは、初期 prototype プロパティを持つべきではない。このセクションで記述される組み込み関数はみな -- コンストラクタも通常の関数も -- 整数の length プロパティを持つ。とくに指定がなければ、この値は、関数説明のセクションの見出しに示される選択的パラメータを含む名前の付いた引数の最大数に等しい。
NOTE 例えば、 String prototype オブジェクトの slice プロパティの初期値である Function オブジェクトは、 2 つの名前つき引数 start と end を示すセクション見出し "String.prototype.slice (start , end)" の下に記述される。それゆえその Function オブジェクトの length プロパティは 2 となる。
各ケースにおいて、このセクションで記述する組込み Function オブジェクトの length プロパティは、属性 { ReadOnly, DontDelete, DontEnum } である (そして他にはない)。このセクションで記述する他のプロパティはそれぞれ、とくに指定がなければ、属性 { DontEnum } (そして他にはない) である
他に定義されなければ、 Call プロパティを持つ組込みオブジェクトの Class プロパティは "Function" であり、 Call プロパティを持たない組込みオブジェクトの Class プロパティは "Object" である。
多くの組込みオブジェクトは関数\である: それらは引数をつけて呼び出すことができる。またいくつかはコンストラクタでもある: それらは new 演算子をを伴う使用を意図されている。この仕様は、各組込み関数ごとに、関数が要求する引数とその Function オブジェクトのプロパティを記述する。各組込みコンストラクタごとに、この仕様は、そのコンストラクタの prototype オブジェクトのプロパティと、コンストラクタを呼び出す new 式によって返されるオブジェクトインスタンスのプロパティも記述する。
個々の関数の説明中で他に定義されなければ、このセクションで記述する関数またはコンストラクタが関数が要求すると定義されているよりも少ない引数を与えられた場合、その引数をそれぞれ undefined として十分な追加引数を与えられたかのように振舞う。
個々の関数の説明中で他に定義されなければ、このセクションで記述する関数またはコンストラクタが関数が許すと定義されているよりも多く引数を与えられた場合、その振る舞いは定義しない。部分的に、実装はこのケースの例外 TypeError を投げることを許される(が、必須ではない)。
組み込み関数のセットに機能を追加する実装は、既存の関数への新規パラメータ追加よりも新規関数の追加によりそれを行うことを奨励する。
各組込み関数と各組込みコンストラクタは Function prototype オブジェクトを持ち、その内部 Prototype プロパティの初期値として、式 Function.prototype (15.3.2.1) の値を持つ。
各組込み prototype オブジェクトは Object prototype オブジェクトを持ち、Object prototype オブジェクト自身以外は、その内部 Prototype プロパティの値として初期は式 Object.prototype (15.3.2.1) の値を持つ。
このセクションで記述されるどの組み込み関数も、個々の関数の記述に特に指定がない限りは、内部 Construct メソッドを実装すべきではない。このセクションで記述されるどの組み込み関数も、個々の関数の記述に特に指定がない限りは、初期 prototype プロパティを持つべきではない。このセクションで記述される組み込み関数はみな -- コンストラクタも通常の関数も -- 整数の length プロパティを持つ。とくに指定がなければ、この値は、関数説明のセクションの見出しに示される選択的パラメータを含む名前の付いた引数の最大数に等しい。
NOTE 例えば、 String prototype オブジェクトの slice プロパティの初期値である Function オブジェクトは、 2 つの名前つき引数 start と end を示すセクション見出し "String.prototype.slice (start , end)" の下に記述される。それゆえその Function オブジェクトの length プロパティは 2 となる。
各ケースにおいて、このセクションで記述する組込み Function オブジェクトの length プロパティは、属性 { ReadOnly, DontDelete, DontEnum } である (そして他にはない)。このセクションで記述する他のプロパティはそれぞれ、とくに指定がなければ、属性 { DontEnum } (そして他にはない) である