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 'こんにちは';
// }