ECMAScript / ECMA-262 Edition 5.1ベースのJavaScript文法
Functionオブジェクトは、関数のオブジェクトです。
Functionオブジェクトは、new 演算子を伴うコンストラクタとしての呼び出し、new 演算子を伴わない関数としての呼び出し、名前付き関数式の代入、無名関数式の代入の何れのケースもインスタンスであるオブジェクトの生成・初期化(インスタンス化)を実行します。
// new 演算子あり
var func_a = new Function ( "num1, num2", "return num1+num2" ) ;
// new 演算子なし
var func_b = Function ( "num1, num2", "return num1*num2" ) ;
// 名前付き関数の代入
var func_c = function func1( num1, num2 ) { return num1-num2 ;}
// 無名関数の代入
var func_d = function ( num1, num2 ) { return num1/num2 ;}
Functionコンストラクタの引数は、文字列として扱う為、ダブルクォートは必須です。(最後の引数として式または関数さえ渡せば、オペランド部の各値は、カンマ区切りは同様ながら、例のようにまとめて、または、任意に分割してダブルクォートで括ることもできます。)
document.write( func_a ( 2, 5 ) ) ; // 7
document.write( func_b ( 2, 5 ) ) ; // 10
document.write( func_c ( 2, 5 ) ) ; // -3
document.write( func_d ( 2, 5 ) ) ; // 0.4
func_a、func_b、func_c、func_d は、何れもインスタンスであるオブジェクトであり、定義した適切な引数を渡すと正しく演算が実行されます。
Functionオブジェクトのプロパティは、下記の通りです。
Functionオブジェクトの標準組み込みプロパティ | |
---|---|
Function.prototype | 初期値は、標準組み込みFunctionプロトタイプオブジェクト |
Function.length | 一般的な引数の数で値は、1。 |
尚、Function.prototypeオブジェクトは、Functionオブジェクト自身ですが、内部的には、標準組み込みObject.prototypeオブジェクトが設定されることになっています。
Function.prototypeオブジェクトの標準組み込みプロパティは、下記の通りです。
Function.prototypeオブジェクトの標準組み込みプロパティ |
---|
Function.prototype.constructor | インスタンスを生成する関数を返す。既定は、標準組み込みFunctionコンストラクタ。 |
Function.prototype.length | 一般的な引数の数。値は、0。 |
Function.prototype.apply ( ) | 呼んでいるオブジェクトとは異なるオブジェクトの文脈にある他のオブジェクトのメソッドを適用する場合、引数が、Arrayオブジェクトとして渡される。 |
Function.prototype.bind ( ) | 呼んだ場合、または、それ自身が、新たな関数を生成した際に提供した与えられた任意の先行する引数の並びを伴う値として文脈内にあるこの関数を呼ぶ場合、新たな関数を生成する。 |
Function.prototype.call ( ) | 異なるオブジェクトのメソッドを呼ぶ(実行する)場合、引数をそのオブジェクトのメソッドに渡す。 |
Function.prototype.toString ( ) | 引数で指定したオブジェクトの関数のソースコードに該当する文字列を返す。 引数がFunctionオブジェクトでない場合、TypeError例外をthrow。 toStringメソッドの利用及びホワイトスペース、行終端、セミコロンの配置等は、実装依存。 |
尚、Functionオブジェクト自体には、引数で指定したオブジェクトのプリミティブ(原始的な)値を返す valueOf メソッドはありませんが、Function.prototypeプロパティのベースである組み込みObject.prototypeオブジェクトの valueOf メソッド( Object.prototype.valueOf )を継承します。
また、Function.prototype.bind を使用して生成した関数オブジェクトは、prototypeプロパティを持ちません。
strict mode(厳格モード)の関数 と一致する関数のインスタンスとFunction.prototype.bind メソッドを使って生成した関数のインスタンスは、TypeError例外を throw する "caller"、"arguments"という名のプロパティを持ちます。
Functionインスタンスでは、一般的な引数の数を示す length プロパティに設定されている数と一致しない数の引数を許容します。(動作については実装依存)
尚、strict mode(厳格モード)の関数からこれらのプロパティへのアクセスを伴う任意の実装仕様上の動作に関連付けられることはないことになっています。