0x0b
js_function&program
最終更新:
0x0b
-
view
関数定義(Function Difinision)
Syntax
FunctionDeclaration :
function Identifier ( FormalParameterListopt ) { FunctionBody }
FunctionExpression :
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
FormalParameterList :
Identifier
FormalParameterList , Identifier
FunctionBody :
SourceElements
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)のプロパティを生成する。
名前 Identifier と Result(1) の値を用いて、(セクション10.1.3 で指定される) 現在の変数オブジェクト(variable object)のプロパティを生成する。
生成規則 FunctionExpression : function ( FormalParameterListopt ) { FunctionBody } は次のように評価される:
FormalParameterList で指定されるパラメータと FunctionBody で指定される body を用いて、セクション 13.2 に指定されるように 新しい Function オブジェクトを生成する。処理中の実行コンテキストのスコープ連鎖内を Scope として渡す。
Result(2) を返す。
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 を閉じるスコープに影響しない。
スコープ連鎖の前に 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) を返す。
SourceElements を評価する。
Result(2) を返す。
定義
関数オブジェクト生成の処理を述べるため、2 つの定義を要する:
等しい文法の生成規則
FunctionBody 文法生成規則を用いる 2 者は、次のうちの一つが真であるとき、等しいものであると定義される:
双方が、同じ ECMAScript プログラムのソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストはグローバルコードから構成され、(実行可能コンテキスト 実行可能コードの種類)の定義に従って、あるものはファンクションコードを含む。
双方が、同じ eval 呼び出し(eval (x)) のソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストは eval コードから構成され、(実行可能コンテキスト 実行可能コードの種類)の定義に従って、あるものはファンクションコードを含む。
NOTE Function コンストラクタ呼び出し(関数として呼出される Functionコンストラクタ Functionコンストラクタ) から取得される FunctionBody を用いる 2 者は、けして等しいとはみなされない。2 つの異なる eval 呼び出しから取得される FunctionBody を用いる 2 者も、それが同じ引数を渡されていたとしても、等しいとはみなされない。
双方が、同じ ECMAScript プログラムのソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストはグローバルコードから構成され、(実行可能コンテキスト 実行可能コードの種類)の定義に従って、あるものはファンクションコードを含む。
双方が、同じ eval 呼び出し(eval (x)) のソーステキスト内の同じロケーションから取得された FunctionBody を用いている。このソーステキストは eval コードから構成され、(実行可能コンテキスト 実行可能コードの種類)の定義に従って、あるものはファンクションコードを含む。
NOTE Function コンストラクタ呼び出し(関数として呼出される Functionコンストラクタ Functionコンストラクタ) から取得される FunctionBody を用いる 2 者は、けして等しいとはみなされない。2 つの異なる eval 呼び出しから取得される FunctionBody を用いる 2 者も、それが同じ引数を渡されていたとしても、等しいとはみなされない。
結合オブジェクト
2 つ以上の Function オブジェクトが結合しているとき、それらは次の特殊な振る舞いを持つ:
オブジェクト O の非内部プロパティが作成または設定される時は、O に結合した全オブジェクトの該当するプロパティが常に直ちに作成され、同じ値および属性を設定される。
オブジェクト O の非内部プロパティが削除される時は、 O に結合した全オブジェクトの該当するプロパティも常に直ちに削除される。
オブジェクト O と P が結合していれば、それらは互いに == および === として比較する。
結合は過渡的で対称である。その結果、オブジェクト O および P が結合し、オブジェクト P および Q が結合する場合、オブジェクト O および Q も自動的に結合する。
NOTE 互いに結合した 2 つ以上のオブジェクトは、それらが異なる内部プロパティを持っているかもしれない点を除いて、事実上判別できない。本仕様において異なってもよいような内部プロパティこそが Scope である。結合されたオブジェクトは、正確な仕様技術用の道具としてこの標準の中で使用される。それは、実際の Function オブジェクトの実装法のガイドラインに使用されることを意図しない。もっと言えば、実際に実装は、2 つ以上の結合された Function オブジェクトの Scope プロパティの差が外部的に観測されず、その場合結合された Function オブジェクトの組を作らずに同じ Function オブジェクトを再使用するという時を検知するかもしれない。この標準は単に ECMAScript プログラムにみられる振る舞いの仕様であるので、これは合法的な最適化である。
オブジェクト O の非内部プロパティが作成または設定される時は、O に結合した全オブジェクトの該当するプロパティが常に直ちに作成され、同じ値および属性を設定される。
オブジェクト O の非内部プロパティが削除される時は、 O に結合した全オブジェクトの該当するプロパティも常に直ちに削除される。
オブジェクト O と P が結合していれば、それらは互いに == および === として比較する。
結合は過渡的で対称である。その結果、オブジェクト O および P が結合し、オブジェクト P および Q が結合する場合、オブジェクト O および Q も自動的に結合する。
NOTE 互いに結合した 2 つ以上のオブジェクトは、それらが異なる内部プロパティを持っているかもしれない点を除いて、事実上判別できない。本仕様において異なってもよいような内部プロパティこそが Scope である。結合されたオブジェクトは、正確な仕様技術用の道具としてこの標準の中で使用される。それは、実際の Function オブジェクトの実装法のガイドラインに使用されることを意図しない。もっと言えば、実際に実装は、2 つ以上の結合された Function オブジェクトの Scope プロパティの差が外部的に観測されず、その場合結合された Function オブジェクトの組を作らずに同じ Function オブジェクトを再使用するという時を検知するかもしれない。この標準は単に ECMAScript プログラムにみられる振る舞いの仕様であるので、これは合法的な最適化である。
Function オブジェクトの生成
FormalParameterList で指定される選択的なパラメータのリスト、FunctionBody で指定される本文、Scope で指定されるスコープ連鎖を与えられ、Function オブジェクトは次のように生成される:
NOTE prototype プロパティは、各関数に自動的に生成され、関数がコンストラクタとして利用される可能性を許可する。
ステップ 1 は実装に、B が A に依存しないところの入れ子の関数 B を持つ関数 A の一般的なケースの最適化を許可する。このケースでは実装は B のために A が呼出される度に毎回新しいものを生成する代わりに同じオブジェクトの再利用を許可される。ステップ 13 はこの最適化を選択的にする; これを実装しないことを選択する実装は、ステップ 2 に進む。
例えば、このコード:
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 オブジェクトの結合に生産的だろう。このポリシーに従うことによって、実装は、それ自体に結合しているオブジェクトの空虚なケースに遭遇するだけになる。
実際、それは、それらの Scope プロパティ間に違いが見られないことを実装が証明でき、それで 1 つのオブジェクトを再使用できる時にのみ、2 つの Function オブジェクトの結合に生産的だろう。このポリシーに従うことによって、実装は、それ自体に結合しているオブジェクトの空虚なケースに遭遇するだけになる。
Call
Function オブジェクト F の Call プロパティが呼出されるとき、次のステップが取られる:
Construct
Function オブジェクト F の Construct プロパティが呼出されるとき、次のステップが取られる:
Program
Syntax
Program :
SourceElements
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
SourceElements
SourceElements :
SourceElement
SourceElements SourceElement
SourceElement :
Statement
FunctionDeclaration
Semantics
生成規則 Program : SourceElements は次のように評価される:
関数宣言のために SourceElements を処理する。
SourceElements を評価する。
Result(2) を返す。
SourceElements を評価する。
Result(2) を返す。
生成規則 SourceElements : SourceElement は関数宣言のためには次のように処理される:
関数宣言のための SourceElement を処理する。
生成規則 SourceElements : SourceElement は次のように評価される:
SourceElement を評価する。
Result(1) を返す。
Result(1) を返す。
生成規則 SourceElements : SourceElements SourceElement は関数宣言のためには次のように処理される:
関数宣言のために SourceElements を処理する。
関数宣言のために SourceElement を処理する。
関数宣言のために SourceElement を処理する。
生成規則 SourceElements : SourceElements SourceElement は次のように評価される:
SourceElements を評価する。
Result(1) が中途完了ならば、 Result(1) を返す。
SourceElement を評価する。
Result(3) を返す。
Result(1) が中途完了ならば、 Result(1) を返す。
SourceElement を評価する。
Result(3) を返す。
生成規則 SourceElement : Statement は関数宣言のためアクション無しで処理される。 生成規則 SourceElement : Statement 次のように評価される:
Statement を評価.
Result(1) を返す。
Result(1) を返す。
生成規則 SourceElement : FunctionDeclaration は関数宣言のためには次のように処理される:
関数宣言のために FunctionDeclaration を処理する。(セクション 13 参照)
生成規則 SourceElement : FunctionDeclaration は次のように評価される:
(normal, empty, empty) を返す。