Functionコンストラクタは新規の Function オブジェクトを作成します。直接コンストラクタを呼ぶことで、関数を動的に作成できますが、 eval と同じくセキュリティとパフォーマンスの問題に悩まされます。

JavaScript におけるすべての関数は、実際には Function オブジェクトです。

構文

new Function ([arg1[, arg2[, ...argN]],] functionBody)

引数

arg1, arg2, ... argN
仮引数の名前として関数で用いるための名前。各々は、妥当な JavaScript の識別子と一致する文字列か、コンマで区切られたような文字列のリストでなければなりません。例えば、"x"、"theValue" 、"a,b"。
functionBody
関数定義を形成する JavaScript の文を含む文字列。

説明

Function コンストラクタで生成された Function オブジェクトは、関数が作成されたときにパースされます。これは、関数を関数式関数宣言を使って定義してコード内で呼び出した場合に比べ、コードの他の部分と一緒にパースされるため、効率が落ちます。

関数に渡されるすべての引数は、関数のパラメーター識別名として、渡される順番どおりに作成されます。

(new 演算子を用いずに) 関数として、Function コンストラクタを実行することは、コンストラクタとして実行することと同じです。

Function のメソッドやプロパティ

グローバル Function オブジェクトは独自のメソッドやプロパティは持ちませんが、Function.prototype からのプロトタイプチェーンを通じていくつかのメソッドやプロパティを継承しています。

Function プロトタイプオブジェクト

プロパティ

Function.arguments
関数に渡した引数に一致する配列。これはFunction オブジェクトのプロパティとしては、非推奨です。代わりに関数内に用意されている arguments オブジェクトを使用してください。
Function.arity
関数によって期待される引数の数を指定します。代わりに length プロパティを使用してください。
Function.caller
現在実行している関数を呼び出した関数を返します。
Function.length
関数によって期待される引数の数を指定します。
Function.name
関数の名前。
Function.prototype.constructor
オブジェクトのプロトタイプを生成する関数を指定します。詳細は Object.prototype.constructor を参照してください。

メソッド

Function.prototype.apply()
Calls a function and sets its this to the provided value, arguments can be passed as an Array object.
Function.prototype.bind()
Creates a new function which, when called, has its this set to the provided value, with a given sequence of arguments preceding any provided when the new function was called.
Function.prototype.call()
Calls (executes) a function and sets its this to the provided value, arguments can be passed as they are.
Function.prototype.isGenerator()
Returns true if the function is a generator; otherwise returns false.
Function.prototype.toSource()
Returns a string representing the source code of the function. Overrides the Object.prototype.toSource method.
Function.prototype.toString()
Returns a string representing the source code of the function. Overrides the Object.prototype.toString method.

Function インスタンス

Function インスタンスは Function.prototype からメソッドとプロパティを継承します。 すべてのコンストラクタと同様に、コンストラクタのプロトタイプオブジェクトを変更することで、すべての Function インスタンスに変更が加えられます。

Function コンストラクタの引数を指定する

次のコードは、2 つの引数を受け取る Function オブジェクトを生成します。

// 例は JavaScript コンソールで直接実行できます

// 2 つの引数を受け取って、引数の合計を返します
var adder = new Function("a", "b", "return a + b");

// 関数の呼び出し
adder(2, 6);
// > 8

引数 "a" と "b" は、"return a + b" という関数の中身において使用される仮引数の名前です。

関数コンストラクタと関数宣言の違い

Function コンストラクタによる関数の生成は、生成コンテキストにクロージャを作りません。つまり常にグローバルスコープで作成します。これを実行すると、 Function コンストラクタの呼び出し元のスコープは入らず、自身のローカル変数とグローバル変数だけにアクセスできます。これは関数式のコードに eval を使うのとは異なっています。

var x = 10;

function createFunction1() {
    var x = 20;
    return new Function('return x;'); // this |x| refers global |x|
}

function createFunction2() {
    var x = 20;
    function f() {
        return x; // this |x| refers local |x| above
    }
    return f;
}

var f1 = createFunction1();
console.log(f1());          // 10
var f2 = createFunction2();
console.log(f2());          // 20

仕様

仕様書 策定状況 コメント
ECMAScript 1st Edition (ECMA-262) 標準 初期定義JavaScript 1.0 に実装
ECMAScript 5.1 (ECMA-262)
Function の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Function の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Function の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり1 あり あり あり
arguments あり あり1 あり あり あり
arity なし なし なし なし なし なし
caller あり あり18 あり あり
displayName ? ?13 ? ? ?
length あり あり1 あり あり あり
name15 あり1 なし あり あり
prototype あり あり1 あり あり あり
apply あり あり1 あり あり あり
bind7 あり4911.65.1
call あり あり1 あり あり あり
isGenerator なし なし5 — 58 なし なし なし
toSource なし なし1 なし なし なし
toString あり あり1 あり あり あり
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり あり あり
arguments あり あり あり4 あり あり あり
arity なし なし なし なし なし なし なし
caller あり あり あり4 あり あり あり
displayName ? ? ?14 ? ? ?
length あり あり あり4 あり あり あり
name あり あり あり4 あり あり あり
prototype あり あり あり4 あり あり あり
apply あり あり あり4 あり あり あり
bind41 あり411.56 あり
call あり あり あり4 あり あり あり
isGenerator なし なし なし5 — 58 なし なし なし
toSource なし なし なし4 なし なし なし
toString あり あり あり4 あり あり あり

関連情報

ドキュメントのタグと貢献者

 最終更新者: Uemmra3,