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
基本サポート 有り 有り 有り 有り 有り 有り
arguments 有り 有り 有り 有り 有り 有り
arity 無し 無し 無し 無し 無し 無し
caller 有り 有り18 有り 有り
displayName ? ?13 ? ? ?
length 有り 有り 有り 有り 有り 有り
name15 有り 有り 無し 有り 有り
prototype 有り 有り 有り 有り 有り 有り
apply 有り 有り 有り 有り 有り 有り
bind7 有り4911.65.1
call 有り 有り 有り 有り 有り 有り
isGenerator 無し 無し5 — 58 無し 無し 無し
toSource 無し 無し 有り 無し 無し 無し
toString 有り 有り 有り 有り 有り 有り
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本サポート 有り 有り 有り 有り 有り 有り ?
arguments 有り 有り 有り 有り 有り 有り ?
arity 無し 無し 無し 無し 無し 無し ?
caller 有り 有り 有り4 有り 有り ?
displayName ? ? ?14 ? ? ?
length 有り 有り 有り 有り 有り 有り ?
name 有り 有り 有り 有り 有り 有り ?
prototype 有り 有り 有り 有り 有り 有り ?
apply 有り 有り 有り 有り 有り 有り ?
bind41 有り411.56 ?
call 有り 有り 有り 有り 有り 有り ?
isGenerator 無し 無し 無し5 — 58 無し 無し ?
toSource 無し 無し 無し 有り 無し 無し ?
toString 有り 有り 有り 有り 有り 有り ?

関連情報

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

 最終更新者: Uemmra3,