Functionコンストラクタは新規の Function オブジェクトを作成します。直接コンストラクタを呼ぶことで、関数を動的に作成できますが、 eval と同じくセキュリティとパフォーマンスの問題に悩まされます。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
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.prototype.arguments- 関数に渡した引数に一致する配列です。これは
Functionオブジェクトのプロパティとしては非推奨です。代わりに関数内に用意されているargumentsオブジェクトを使用してください。 Function.arity関数によって期待される引数の数を指定します。代わりにlengthプロパティを使用してください。Function.prototype.caller- 現在実行している関数を呼び出した関数を返します。
Function.prototype.length- 関数によって期待される引数の数を指定します。
Function.prototype.name- 関数の名前です。
Function.displayName- 関数の表示名です。
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
Arrayobject. 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 a function and sets its this to the provided value. Arguments can be passed as they are.
Function.prototype.isGenerator()- Returns
trueif the function is a generator; otherwise returnsfalse. Function.prototype.toSource()- Returns a string representing the source code of the function. Overrides the
Object.prototype.toSourcemethod. Function.prototype.toString()- Returns a string representing the source code of the function. Overrides the
Object.prototype.toStringmethod.
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 の定義 |
ドラフト |
ブラウザ実装状況
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Function | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
apply | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5.5 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
arguments | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
arity | Chrome 未対応 なし | Edge 未対応 なし | Firefox 未対応 なし | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 未対応 なし | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
bind | Chrome 完全対応 7 | Edge 完全対応 12 | Firefox 完全対応 4 | IE 完全対応 9 | Opera 完全対応 11.6 | Safari 完全対応 5.1 | WebView Android 完全対応 4 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 12 | Safari iOS 完全対応 6 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
call | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5.5 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
caller | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 8 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
displayName | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 13 | IE 未対応 なし | Opera 未対応 なし | Safari ? | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 14 | Opera Android 未対応 なし | Safari iOS ? | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
isGenerator | Chrome 未対応 なし | Edge 未対応 なし | Firefox 未対応 5 — 58 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 未対応 5 — 58 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
length | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
name | Chrome 完全対応 15 | Edge 完全対応 14 | Firefox 完全対応 1 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 あり | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 あり | nodejs 完全対応 あり |
prototype | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
toSource | Chrome 未対応 なし | Edge 未対応 なし | Firefox 完全対応 1 | IE 未対応 なし | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 完全対応 4 | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
toString | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 実装状況不明
- 実装状況不明
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非推奨。新しいウェブサイトでは使用しないでください。
- 非推奨。新しいウェブサイトでは使用しないでください。