JavaScriptの関数オブジェクトについて
- Function コンストラクタ
- 関数の引数の数 (length プロパティ)
- arguments オブジェクト
- this キーワード
- caller プロパティ
- prototype プロパティ
- call メソッド
- apply メソッド
- bind メソッド
- toString メソッド
Function コンストラクタ
JavaScriptでは、Function
コンストラクタを使用して動的に関数を作成することができます。
構文は以下の通りです:
func = new Function(arg1, arg2, ..., statements);
例:
let add = new Function('a', 'b', 'return a + b;'); console.log(add(3, 5)); // 出力: 8
動的に関数を生成できるため便利ですが、eval()
と同様に使用する際には注意が必要です。
関数の引数の数 (length プロパティ)
Function.prototype.length
は、関数が期待する引数の数を返します。
ただし、デフォルト値を持つ引数や可変長引数(...args
)はカウントされません。
function example(a, b, c = 10) {} console.log(example.length); // 出力: 2
arguments オブジェクト
arguments
オブジェクトは、関数内で渡された全ての引数を配列風の形式で提供します。
例えば:
function sum() { let total = 0; for (let i = 0; i < arguments.length; i++) { total += arguments[i]; } return total; } console.log(sum(1, 2, 3, 4)); // 出力: 10
数学的には、次のように総和を表せます: \[ \text{sum}(x_1, x_2, \dots, x_n) = \sum_{i=1}^{n} x_i \]
this キーワード
this
は、関数が呼び出された際のコンテキストを表します。通常はオブジェクトを指しますが、
使用方法によって異なる場合があります。
let obj = { value: 42, getValue: function() { return this.value; } }; console.log(obj.getValue()); // 出力: 42
数学的に言えば、this
は関数の作用する対象を定義するための変数と見なせます。
caller プロパティ
func.caller
は、呼び出し元の関数を参照します。ただし、このプロパティは現在非推奨です。
function outer() { inner(); } function inner() { console.log(inner.caller); } outer(); // 出力: [Function: outer]
prototype プロパティ
Function.prototype
は、関数で作成されるオブジェクトのプロトタイプを定義します。
例えば、次のようにプロトタイプを拡張できます:
function Person(name) { this.name = name; } Person.prototype.greet = function() { return `こんにちは、${this.name}さん!`; }; let john = new Person('ジョン'); console.log(john.greet()); // 出力: こんにちは、ジョンさん!
call メソッド
func.call(this, arg1, arg2, ...)
は、関数を指定したコンテキスト(this
)で実行します。
function greet(greeting) { console.log(`${greeting}, ${this.name}!`); } let person = { name: '太郎' }; greet.call(person, 'こんにちは'); // 出力: こんにちは, 太郎!
apply メソッド
func.apply(this, args)
は、call
と似ていますが、引数を配列で渡します。
function sum(a, b) { return a + b; } console.log(sum.apply(null, [3, 7])); // 出力: 10
bind メソッド
func.bind(thisArg, arg1, arg2, ...)
は、関数のthis
を固定し、新しい関数を返します。
let module = { x: 42, getX: function() { return this.x; } }; let getX = module.getX.bind(module); console.log(getX()); // 出力: 42
toString メソッド
func.toString()
は、関数のソースコードを文字列として返します。
function hello() { return 'こんにちは'; } console.log(hello.toString()); // 出力: function hello() { // return 'こんにちは'; // }