本頁の目次 目次

15.3 Function オブジェクト

15.3.1 関数として呼出される Function コンストラクタ

Function がコンストラクタとしてではなく関数として呼出される場合、それは新しい Function オブジェクトを作成し初期化する。したがって、関数呼び出し Function(…) は、同じ引数をとるオブジェクト生成式 new Function(…) と等価である。

15.3.1.1 Function (p1, p2, … , pn, body)

Function 関数がある引数 p1, p2, …, pn, body (n が 0、つまり、"p" 引数がないかもしれず、 body も提供されないかもしれない) で呼出される場合、次のステップが取られる:

  1. Function コンストラクタが同じ引数で呼出されたかのように(15.3.2.1)、新しい Function オブジェクトを作成して返す。

15.3.2 Function コンストラクタ

Function が new 式の一部で呼出されるとき、それはコンストラクタである: それは新たに生成されたオブジェクトを初期化する。

15.3.2.1 new Function (p1, p2, … , pn, body)

最後の引数は、関数の本文(実行可能なコード)を指定する; 先行する引数は仮引数を指定する。Function コンストラクタががある引数 p1, p2, …, pn, body (n が 0、つまり、"p" 引数がないかもしれず、 body も提供されないかもしれない) で呼出される場合、次のステップが取られる:

  1. P を空文字列とする。
  2. 引数が与えられなければ、 body を空文字列として、ステップ 13 へ。
  3. 引数が 1 つ与えられたならば、body をその引数として、ステップ 13 へ。
  4. Result(4) を最初の引数とする。
  5. P を ToString(Result(4)) とする。
  6. k を 2 とする。
  7. k が引数の数と等しければ、 bodyk 番目の引数として、ステップ 13 へ。
  8. Result(8) を k 番目の引数とする。
  9. ToString(Result(8)) を呼出す。
  10. P を 前の P の値, 文字列 "," (カンマ), Result(9) を連結した結果とする。
  11. k を 1 増加させる。
  12. ステップ 7 へ。
  13. ToString(body) を呼出す。
  14. PFormalParameterListopt として解析不能ならば、例外 SyntaxError を投げる。
  15. bodyFunctionBody として解析不能であれば、例外 SyntaxError を投げる。
  16. FormalParameterListopt として P を解析したもの、 FunctionBody として body を解析したものをパラメータに渡し、13.2 に規定されるように、新規 Function オブジェクトを生成する。Scope パラメータとしてグローバルオブジェクトから構成されるスコープチェーン内を渡す。
  17. Result(16) を返す。

prototype プロパティは、関数がコンストラクタとして使用される可能性に備え、すべての関数に自動的に作成される。

NOTE 指定される各仮引数のために 1 引数を持つのは許容されるが、必須ではない。

例えば、次の 3 つの表現はすべて同じ結果を生む:

new Function("a", "b", "c", "return a+b+c")
new Function("a, b, c", "return a+b+c")
new Function("a,b", "c", "return a+b+c")

15.3.3 Function コンストラクタのプロパティ

Function コンストラクタの内部 [[Prototype]] プロパティは Function プロトタイプオブジェクト (15.3.4) である。 内部プロパティと length プロパティ (値は1) の他に、 Function コンストラクタは次のプロパティを持つ:

15.3.3.1 Function.prototype

Function.prototype の初期値は Function プロトタイプオブジェクト (15.3.4) である。

このプロパティは属性 { DontEnum, DontDelete, ReadOnly } である。

15.3.4 Function プロトタイプオブジェクトのプロパティ

Function プロトタイプオブジェクトはそれ自体が Function オブジェクトであり (その [[Class]] が "Function" である)、起動された時、どんな引数も受け付け、undefined を返す。

Function プロトタイプオブジェクトの内部 [[Prototype]] プロパティの値は、Object プロトタイプオブジェクト(15.3.2.1) である。

それは "空の本文" をもつファンクションである; 呼び出されれば、単に undefined を返す。

Function プロトタイプオブジェクトは、自分自身の valueOf プロパティを持たない; だが、Object プロトタイプオブジェクトの valueOf プロパティを継承する。

15.3.4.1 Function.prototype.constructor

Function.prototype.constructor の初期値は、組込み Function コンストラクタである。

15.3.4.2 Function.prototype.toString ( )

関数の実装依存の表現が返される。この表現は FunctionDeclaration の構文を持つ。表現文字列内の空白、行終端子、セミコロンの使用及び配置は実装依存であることに特に注意。

toString 関数は汎用的ではない; その this 値が Function オブジェクトでなければ、例外 TypeError を投げる。それゆえ、メソッドとして他の種類のオブジェクトに転用できない。

15.3.4.3 Function.prototype.apply (thisArg, argArray)

apply メソッドは 2 つの引数、 thisArg および argArray をとり、オブジェクトの [[Call]] プロパティを使用して、関数呼出しを実行する。オブジェクトが [[Call]] プロパティを持っていない場合、例外 TypeError が投げられる。

thisArg が null または undefined の場合、呼出された関数は this 値としてグローバルオブジェクトを渡される。そうでなければ、呼出された関数は this 値として ToObject(thisArg) を渡される。

argArray が null または undefined の場合、呼出された関数は引数を渡されない。そうでなければ、 argArray が配列でも arguments オブジェクト (10.1.8 参照) でもない場合、例外 TypeError が投げられる。 argArrayが 配列または arugments オブジェクトのいずれかである場合、関数は (ToUint32(argArray.length)) 個の引数argArray[0], argArray[1], ... argArray[ToUint32(argArray.length)-1] を渡される。

apply メソッドの length プロパティは 2 である。

15.3.4.4 Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )

call メソッドは 1 つ以上の引数を取り、thisArg および(選択的に) arg1, arg2, ... をとり、オブジェクトの[[Call]] プロパティを使用して、関数呼び出しを実行する。オブジェクトが [[Call]] プロパティを持っていない場合、TypeError 例外が投げられる。呼出された関数は、引数として arg1arg2 などを渡される。 thisArg が null または undefined の場合、呼出された関数は this 値としてグローバルオブジェクトを渡される。そうでなければ、呼出された関数は this 値として ToObject(thisArg) を渡される。 call メソッドの length プロパティは 1 である。

15.3.5 Function インスタンスのプロパティ

必須の内部プロパティに加えて、各ファンクション実体は [[Call]] プロパティ、 [[Construct]] プロパティ、 [[Scope]] プロパティ (8.6.2 及び 13.2 を参照) を持つ。[[Class]] プロパティの値は "Function" である。

15.3.5.1 length

length プロパティの値は通常、関数に期待される "典型的な" 引数の数を示す整数\である。だが、言語はそれ以外の数の引数\で関数が呼び出されることを許す。length プロパティによって指定される以外の数の引数\で呼び出された時の関数の振舞いは、関数に依存する。このプロパティは属性 { DontDelete, ReadOnly, DontEnum } である。

15.3.5.2 prototype

prototype プロパティの値は、Function オブジェクトがコンストラクタとして呼出される前に、新しく作成されるオブジェクトの内部 [[prototype]] プロパティの初期化に使用される。このプロパティは属性 { DontDelete } である。

15.3.5.3 [[HasInstance]] (V)

F を Function オブジェクトと仮定する。F の [[HasInstance]] メソッドが値 V で呼出されるとき、次のステップが取られる:

  1. V がオブジェクトでなければ、 false を返す。
  2. F の [[Get]] メソッドを、プロパティ名 "prototype" で呼出す。
  3. O を Result(2) とする。
  4. O がオブジェクトでなければ、TypeError 例外を投げる。
  5. VV の [[Prototype]] プロパティの値とする。
  6. V が null ならば、false を返す。
  7. OV が同じオブジェクトを参照している、あるいは
  8. 互いに連結されたオブジェクト(13.1.2)を参照していれば、true を返す。
  9. ステップ 5 へ.

Page Contents

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