JavaScript

Function オブジェクト

 編集:2022.08.12 by T.A.

JavaScript の関数は、実際にはすべて Function オブジェクトです。これは、(function(){}).constructor === Function というコードが true を返すことで確認することができます。

コンストラクター
new Function([arg1 [, arg2 [, ...argN]] ,] functionBody)
新しい Function オブジェクトを生成します。コンストラクターを直接呼び出すと関数を動的に生成することができますが、セキュリティや、eval と似た性能の(ただし、はるかに重要性の低い)問題を抱えます。ただし eval とは異なり、Function コンストラクターはグローバル スコープで実行される関数のみを生成します。
インスタンス プロパティ
Function.arguments 非推奨
関数に渡した引数に対応する配列です。 これは Function オブジェクトのプロパティとしては非推奨です。代わりに関数内に用意されている arguments オブジェクト(関数内で使用可能)を使用してください。
Function.caller 非推奨
現在実行している関数を呼び出した関数を返します。

このプロパティは非推奨であり、一部の厳格モードではない関数でのみ機能します。

Function.displayName 非標準
関数の表示名です。
Function.length
関数によって期待される引数の数を指定します。
Function.name
関数の名前です。
インスタンス メソッド
Function.apply(thisArg[, argsArray])
関数を呼び出し、this 値と引数(配列風)を渡します。
Function.bind(thisArg[, arg1[, arg2[, ...argN]]])
指定の this 値と指定の引数を渡した関数を返します。
Function.call(thisArg[, arg1, arg2, ...argN])
関数を呼び出して、this 値と引数を渡します。
Function.toString()
関数のソースコードを表す文字列を返します。

Object.toString() メソッドを上書きします。

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 はモジュールのローカルになるからです。


テスト