Function

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 の定義

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
FunctionChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
Function() constructorChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
applyChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 4Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
arguments
非推奨非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
bindChrome 完全対応 7Edge 完全対応 12Firefox 完全対応 4IE 完全対応 9Opera 完全対応 11.6Safari 完全対応 5.1WebView Android 完全対応 4Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 12Safari iOS 完全対応 6Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
callChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5.5Opera 完全対応 4Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
caller
非標準
Chrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 8Opera 完全対応 9.6Safari 完全対応 3WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
displayName
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 完全対応 13IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 14Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
lengthChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 4Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
nameChrome 完全対応 15Edge 完全対応 14Firefox 完全対応 1IE 未対応 なしOpera 完全対応 10.5Safari 完全対応 6WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 11Safari iOS 完全対応 6Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり
toSource
非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 未対応 1 — 74
補足
未対応 1 — 74
補足
補足 Starting in Firefox 74, toSource() is no longer available for use by web content. It is still allowed for internal and privileged code.
IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしFirefox Android 完全対応 4Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
toStringChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 5Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 あり

凡例

完全対応  
完全対応
未対応  
未対応
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。
非推奨。新しいウェブサイトでは使用しないでください。
非推奨。新しいウェブサイトでは使用しないでください。
実装ノートを参照してください。
実装ノートを参照してください。

関連情報