JavaScript の関数は、実際にはすべて Function オブジェクトです。これは、 (function(){}).constructor === Function というコードが true を返すことで確認することができます。
コンストラクター
Function()Functionコンストラクターは、新しいFunctionオブジェクトを生成します。コンストラクターを直接呼び出すと関数を動的に生成することができますが、セキュリティや、evalと似た性能の (ただし、遥かに重要性の低い) 問題を抱えます。ただし eval とは異なり、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(thisArg [, argsArray])- 関数を呼び出し、
thisを提供されたthisArgに設定します。引数はArrayとして渡すことができます。 Function.prototype.bind(thisArg[, arg1[, arg2[, ...argN]]])- 新しい関数を作成し、呼び出されたときに、
thisを提供されたthisArgに設定します。任意で、指定された一連の引数が、新しく結びつけられた関数が呼び出されたときに与えられた引数の前に付加されます。 Function.prototype.call()- 関数を呼び出して、
thisに提供した値を設定します。引数は、指定するオブジェクトのものとして渡すことができます。 Function.prototype.isGenerator()- 関数がジェネレーターである場合は
trueを返し、それ以外の場合はfalseを返します。 Function.prototype.toSource()- 関数のソースコードを表す文字列を返します。
Object.prototype.toSourceメソッドを上書きします。 Function.prototype.toString()- 関数のソースコードを表す文字列を返します。
Object.prototype.toStringメソッドを上書きします。 Function.prototype[@@hasInstance]()- どのオブジェクトが対応するコンストラクター関数のインスタンスであるかを確認するために使用します。このプロパティは
Function.prototypeのプロパティなので、基本的にはほとんどの関数で継承されます。
Function インスタンス
Function インスタンスは Function.prototype からメソッドとプロパティを継承します。すべてのコンストラクターと同様に、コンストラクターのプロトタイプオブジェクトを変更することで、すべての Function インスタンスに変更を加えることができます。
例
Funciton コンストラクターと関数宣言の違い
Function コンストラクターで生成された関数は、生成コンテキストにクロージャを作りません。つまり常にグローバルスコープで生成されます。これを実行すると、 Function コンストラクターの呼び出し元のスコープは入らず、自身のローカル変数とグローバル変数だけにアクセスできます。これは関数式のコードに eval を使うのとは異なります。
var x = 10;
function createFunction1() {
var x = 20;
return new Function('return x;'); // この |x| はグローバルの |x| を表す
}
function createFunction2() {
var x = 20;
function f() {
return x; // この |x| は上記のローカルの |x| を表す
}
return f;
}
var f1 = createFunction1();
console.log(f1()); // 10
var f2 = createFunction2();
console.log(f2()); // 20
このコードはウェブブラウザーでは動作しますが、 Node.js では f1() で ReferenceError が発生します。 x が見つからないためです。これは Node の最上位のスコープがグローバルスコープではなく、 x はモジュールのローカルになるからです。
仕様書
| 仕様書 |
|---|
| ECMAScript (ECMA-262) Function の定義 |
ブラウザーの互換性
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。
Update compatibility data on GitHub
| デスクトップ | モバイル | サーバー | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Function | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
Function() constructor | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
apply | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 5.5 | Opera 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
arguments | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | 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 完全対応 4 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
caller | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 8 | Opera 完全対応 9.6 | Safari 完全対応 3 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | 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 未対応 なし |
length | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
name | Chrome 完全対応 15 | Edge 完全対応 14 | Firefox 完全対応 1 | IE 未対応 なし | Opera 完全対応 10.5 | Safari 完全対応 6 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 11 | Safari iOS 完全対応 6 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
toSource | Chrome 未対応 なし | Edge 未対応 なし | Firefox
未対応
1 — 74
| 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 完全対応 3 | Safari 完全対応 1 | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 10.1 | Safari iOS 完全対応 1 | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非推奨。新しいウェブサイトでは使用しないでください。
- 非推奨。新しいウェブサイトでは使用しないでください。
- 実装ノートを参照してください。
- 実装ノートを参照してください。