訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
【構文】 FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody } FunctionExpression : function Identifieropt ( FormalParameterListopt ) { FunctionBody } FormalParameterList : Identifier FormalParameterList , Identifier FunctionBody : SourceElementsopt
【セマンティックス】 プロダクション
FunctionDeclaration : function Identifier ( FormalParameterListopt ) { FunctionBody }
は、宣言結合のインスタンス化 (10.5 Declaration Binding instantiation )中で次のようにインスタンス化されます。
1.FormalParameterListoptによって指定したパラメータとFunctionBodyによって指定したボディを伴う 13.2 で指定したような新たなFunctionオブジェクトを生成した結果を返す Scopeとして実行中の実行コンテキストのVariableEnvironmentに渡す FunctionDeclarationがstrict(モードの)コードに含まれる場合、当該FunctionBodyが、strict(モードの)コードである場合には、Strictフラグとしてtrueを渡す
プロダクション
FunctionExpression : function ( FormalParameterListopt ) { FunctionBody }
は、次のように評価されます。
1.FormalParameterListoptによって指定したパラメータとFunctionBodyによって指定したボディを伴う 13.2 で指定したような新たなFunctionオブジェクトを生成した結果を返す Scopeとして実行中の実行コンテキストのLexicalEnvironmentに渡す FunctionExpressionが、strict(モードの)コードに含まれる場合、当該FunctionBodyが、strict(モードの)コードである場合には、Strictフラグとしてtrueを渡す
プロダクション
FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody }
は、次のように評価されます。
1. funcEnv は、引数として実行中の実行コンテキストの語彙環境を渡すことによってNewDeclarativeEnvironmentを呼んだ結果とする 2. envRec は、funcEnvの環境レコードとする 3.引数として識別子のString値を渡すことによって envRec の具体的なメソッドCreateImmutableBindingを呼ぶ 4. closure は、FormalParameterListoptによって指定したパラメータとFunctionBodyによって指定したボディを伴う 13.2 で指定したような新たなFunctionオブジェクトを生成した結果とする Scopeとして funcEnv 内で渡す FunctionExpressionが、strict(モードの)コードに含まれる場合や、そのFunctionBodyが、strict(モードの)コードである場合には、Strictフラグとしてtrueを渡す 5.引数としてIdentifierとclosureのString値を渡すことによって envRec の具体的なメソッドInitializeImmutableBindingを呼ぶ 6. closureを返す
[注釈] FunctionExpression (関数式) 内の識別子は、それ自身を再帰的に呼ぶ関数を許容する為に FunctionExpression の FunctionBody (関数本体)内から参照されることが可能です。 しかしながら、(この項冒頭の【構文】の) FunctionDeclaration (関数宣言)内とは異なり、 FunctionExpression (関数式)そのものに含まれる Identifier (つまり、関数名としての Identifier )は、参照不可であり、 FunctionExpression を括るスコープへの影響はありません。
プロダクション
FunctionBody : SourceElementsopt
は、次のように評価されます。
1. FunctionBodyの code は、FunctionDeclaration や FunctionExpressionの一部が、strict(モードの)コードに含まれる場合、または、当該SourceElementsの指定プロローグ (14.1 指定プロローグ)が、Use Strict 指定を含む場合、または、10.1.1 内の条件の一部を適用する場合には、strictモードのコード このFunctionBodyのコードが、strictモードのコードである場合、SourceElementsは、strictモードのコードのように次のステップで評価 それ以外の場合には、SourceElementsは、非strictモードのコードのように次のステップで評価 2. SourceElementsが、存在する場合には、SourceElementsを評価した結果を返す 3.それ以外の場合、return (normal, undefined, empty)
識別子の値がstrictモードのFunctionDeclaration や FunctionExpressionのFormalParameterList内に1つ以上現れる場合には、SyntaxErrorエラーです。 識別子 "eval" や識別子 "arguments" が、strictモードのFunctionDeclaration や FunctionExpressionのFormalParameterList内に現れる場合には、SyntaxErrorエラーです。 識別子 "eval" や識別子 "arguments" が、strictモードのFunctionDeclaration や FunctionExpressionの識別子として現れる場合には、SyntaxErrorエラーです。
オプションのFormalParameterListによって指定したパラメータリスト、FunctionBodyによって指定した本体、Scopeによって指定した語彙環境、Booleanフラグ Strict と Functionオブジェクトを与えた場合には、次のように構築されます。
1.新たにネイティブなECMAScriptオブジェクトを生成し、F は、オブジェクトとする 2. 8.12で説明したような F から成る[[Get]]を除く内部メソッドを全て設定 3. F の[[Class]]内部プロパティに"Function"を設定 4. F の[[Prototype]]内部プロパティに15.3.3.1で指定したように標準組み込みFunctionプロトタイプオブジェクトを設定 5. 15.3.5.4で説明したように F から成る[[Get]]内部プロパティを設定 6. 13.2.1で説明したように F から成る[[Call]]内部プロパティを設定 7. 13.2.2で説明したように F から成る[[Construct]]内部プロパティを設定 8. 15.3.5.3で説明したように F から成る[[HasInstance]]内部プロパティを設定 9. F の[[Scope]]内部プロパティにScopeの値を設定 10. names は、FormalParameterListの識別子と一致する文字列であり、左から右に向かってテキスト順で含まれる List とする もし、指定されるパラメータがない場合には、 names は、カラのリストとする 11. F の[[FormalParameters]]内部プロパティにnamesを設定 12. F の[[Code]]内部プロパティにFunctionBodyを設定 13. F の[[Extensible]]内部プロパティにtrueを設定 14. len は、FormalParameterListで指定した正規のパラメータの数とする もし、指定されるパラメータがない場合には、 len は、0とする 15.引数 "length"、プロパティ記述子 {[[Value]]: len, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}、falseを伴う F の[[DefineOwnProperty]]内部プロパティを呼ぶ 16. proto は、名称を伴う標準組み込みコンストラクタであるObjectとなる式 new Object() によって構築されるかのように新たなオブジェクトを生成した結果とする 17.引数 "constructor"、プロパティ記述子 {[[Value]]: F, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}、 falseを伴う proto の内部メソッド[[DefineOwnProperty]]を呼ぶ 18.引数 "prototype"、プロパティ記述子 {[[Value]]: proto, { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false}、 falseを伴う F の内部メソッド[[DefineOwnProperty]]を呼ぶ 19. Strict が、trueである場合、 a. thrower は、 [[ThrowTypeError]] 関数オブジェクト (13.2.3)とする b.引数 "caller"、PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}、falseを伴う F の内部メソッド[[DefineOwnProperty]]を呼ぶ c.引数 "arguments"、PropertyDescriptor {[[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}、falseを伴う F の内部メソッド[[DefineOwnProperty]]を呼ぶ 20. F を返す
[注釈] prototype プロパティは、コンストラクタとして使用される関数という可能性を許容する為に関数ごとに自動的に生成されます。
Functionオブジェクト F における内部メソッド[[Call]]が、 this 値と引数のリストを伴って呼ばれる際には、次のステップがとられます。
1. funcCtx は、10.4.3で説明したように引数リスト args と this 値を渡すことによって F の内部プロパティ[[FormalParameters]]の値を使用して関数コードにおける新たな実行コンテキストを生成した結果とする 2. result は、 F の内部プロパティ[[Code]]の値であるFunctionBodyを評価した結果とする F が内部プロパティ[[Code]]を持たない場合や当該値がカラのFunctionBodyである場合、 result は、(normal, undefined, empty) とする 3.実行コンテキスト以前に復元中に、実行コンテキスト funcCtx を抜ける 4. result.type が、 throwである場合、 result.value を投げる(スローする) 5. result.type が、 returnである場合、 result.value を返す 6.それ以外の場合、 result.type は、normalとしなければならず、またundefinedを返す
関数オブジェクト F における内部メソッド[[Construct]]が、引数として利用可能なカラのリストを伴って呼ばれる場合、次のステップがとられます。
1. obj は、新たに生成したネイティブECMAScriptオブジェクトとする 2. 8.12で指定したように obj の全ての内部メソッドを設定 3. obj の内部プロパティ[[Class]]に"Object"を設定 4. obj の内部プロパティ[[Extensible]]に trueを設定 5. proto は、引数"prototype"を伴う F の内部プロパティ[[Get]]を呼ぶ値とする 6. Type(proto) が、 Objectであれば、 obj の内部プロパティ[[Prototype]]に protoを設定 7. Type(proto) が、 Objectでなければ、 obj の内部プロパティ[[Prototype]]に 15.2.4で説明したように標準組み込みObject型プロトタイプオブジェクトを設定 8. resultは、this 値として obj を提供し、 args として[[Construct]]に渡した引数リストの提供することによって F の内部プロパティ[[Call]]を呼んだものを結果とする 9. Type(result) が、Objectである場合、 result を返す 10. objを返す
[[ThrowTypeError]] オブジェクトは、次のように1度だけ定義される一意の関数オブジェクトです。
1.新たなネイティブECMAScriptオブジェクトを生成し、 F は、オブジェクトとする 2. 8.12で説明したように F の全ての内部プロパティを設定 3. F の内部プロパティ[[Class]]に"Function"を設定 4. F の内部プロパティ[[Prototype]]に 15.3.3.1で指定したように標準組み込みFunctionプロトタイプオブジェクトを設定 5. 13.2.1で説明したように F の内部プロパティ[[Call]]を設定 6. F の内部プロパティ[[Scope]]にGlobal環境を設定 7. F の内部プロパティ[[FormalParameters]]にカラのリストを設定 8. F の内部プロパティ[[Code]]に無条件にTypeError例外を投げ(スローし)、他に実行するものが何もないFunctionBodyとして設定 9.引数"length"、プロパティ記述子 {[[Value]]: 0, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false}、 falseを伴う F の内部メソッド[[DefineOwnProperty]]を呼ぶ 10. F の内部プロパティ[[Extensible]]に falseを設定 11. [[ThrowTypeError]]は、F とする