JavaScript 関数: コードをもっとスマートに! 宣言と式の賢い使い分け
JavaScriptにおける関数宣言と関数式の比較
関数宣言は、function
キーワード followed by a function name, parentheses, and an optional block of code.
function greet(name) {
console.log("Hello, " + name + "!");
}
関数宣言は、宣言された行より前に呼び出すことができます。これは、関数ホイスティングと呼ばれるメカニズムによるものです。
関数式は、function
キーワード followed by parentheses and an optional block of code, but without a function name.
const greet = function(name) {
console.log("Hello, " + name + "!");
};
関数式は、変数に代入したり、引数として渡したりすることができます。また、即時実行関数式 (IIFE) として使用することもできます。
(function(name) {
console.log("Hello, " + name + "!");
})();
関数式は、宣言された行まで呼び出すことはできません。
主な違い
機能 | 関数宣言 | 関数式 |
---|---|---|
関数名 | 必須 | オプション |
ホイスティング | 可能 | 不可 |
スコープ | グローバルまたはローカル | ローカル |
IIFE | 不可 | 可能 |
- 関数がグローバルにアクセス可能で、コード内で何度も呼び出される場合は、関数宣言を使用します。
- 匿名関数が必要な場合は、関数式を使用します。
例
以下の例では、関数宣言と関数式を使用して、同じ機能を持つ2つの関数を作成します。
function greetPerson(name) {
console.log("Hello, " + name + "!");
}
const greetFriend = function(name) {
console.log("Hello, " + name + "!");
};
greetPerson("Alice"); // Hello, Alice!
greetFriend("Bob"); // Hello, Bob!
この例では、greetPerson
は関数宣言で、greetFriend
は関数式です。どちらも同じ機能を持っていますが、greetPerson
はグローバルにアクセス可能で、greetFriend
はローカルにのみアクセス可能です。
関数宣言と関数式は、どちらもJavaScriptで関数を定義するために使用されます。それぞれ長所と短所があり、状況に応じて使い分けることが重要です。
// 関数宣言
function greetPerson(name) {
console.log("Hello, " + name + "!");
}
greetPerson("Alice"); // Hello, Alice!
// 関数式
const greetFriend = function(name) {
console.log("Hello, " + name + "!");
};
greetFriend("Bob"); // Hello, Bob!
// 即時実行関数式 (IIFE)
(function(name) {
console.log("Hello, " + name + "!");
})(); // Hello, world!
// アロー関数
const greet = (name) => {
console.log("Hello, " + name + "!");
};
greet("Charlie"); // Hello, Charlie!
greetPerson
は名前を受け取って "Hello, " と名前を出力する関数宣言です。- 匿名関数で名前を受け取って "Hello, " と名前を出力する IIFE です。
各関数は同じ機能を持っていますが、異なる構文で記述されています。
JavaScriptで関数を作成するその他の方法
メソッド
オブジェクトのプロパティとして定義された関数は、メソッドと呼ばれます。メソッドは、ドット記法を使用してオブジェクトから呼び出すことができます。
const person = {
name: "John Doe",
greet: function() {
console.log("Hello, my name is " + this.name + ".");
}
};
person.greet(); // Hello, my name is John Doe.
この例では、person
オブジェクトに greet
メソッドが定義されています。このメソッドは、person.greet()
と呼び出すことができます。
コンストラクタ
new
キーワードを使用してオブジェクトを作成する際に、コンストラクタ関数を実行することができます。コンストラクタは、オブジェクトのプロパティを初期化するために使用されます。
function Person(name) {
this.name = name;
}
const person = new Person("Jane Doe");
console.log(person.name); // Jane Doe
この例では、Person
コンストラクタは name
プロパティを持つ新しい Person
オブジェクトを作成します。
ジェネレータ関数
ジェネレータ関数は、イテレータオブジェクトを返す特殊な関数です。イテレータオブジェクトは、next()
メソッドを呼び出すことで、値のシーケンスを順次返すことができます。
function* greetGenerator() {
yield "Hello";
yield "World";
}
const generator = greetGenerator();
console.log(generator.next().value); // Hello
console.log(generator.next().value); // World
この例では、greetGenerator
ジェネレータ関数は "Hello" と "World" の値を順番に返すイテレータオブジェクトを返します。
アロー関数
アロー関数は、簡潔な構文で関数を定義できる方法です。アロー関数は、引数リスト、アロー演算子 (=>
)、および関数本体で構成されます。
const greet = (name) => {
console.log("Hello, " + name + "!");
};
greet("Peter"); // Hello, Peter!
この例では、greet
アロー関数は名前を受け取って "Hello, " と名前を出力します。
これらの方法は、それぞれ異なる状況で役立ちます。状況に応じて適切な方法を選択することが重要です。
javascript function