JavaScriptにおける関数
この記事ではJavaScriptにおける関数について説明します。
YouTube Video
JavaScriptにおける関数
JavaScriptにおける関数は、再利用可能なコードのブロックで、特定のタスクを実行するために使用されます。関数を使うことで、コードの可読性が向上し、メンテナンスが容易になります。関数にはいくつかの定義方法があり、引数や戻り値などを使って柔軟に操作できます。
関数の定義方法
関数宣言(Function Declaration)
関数は、function
キーワードを使って定義できます。関数宣言は、コードが実行される前にホイスティングされるため、定義前に呼び出すことが可能です。
1console.log(greet("Everyone")); // Hello, Everyone
2
3function greet(name) {
4 return "Hello, " + name;
5}
6
7console.log(greet("Alice")); // Hello, Alice
この例では、関数宣言前にもgreet
関数を呼び出しているため、Hello, Everyone
とHello, Alice
が表示されます。
関数式(Function Expression)
関数を変数に代入して定義することもできます。この場合、関数はホイスティングされず、定義後にのみ呼び出すことができます。
1const greet = function(name) {
2 return "Hello, " + name;
3};
4
5console.log(greet("Bob")); // Hello, Bob
この例では、Hello, Bob
と表示されます。
アロー関数(Arrow Function)
アロー関数は、短い構文で関数を定義できる形式です。特に無名関数(名前のない関数)を使うときに便利です。また、アロー関数はthis
キーワードの扱いが異なる特徴があります。
1const greet = (name) => {
2 return "Hello, " + name;
3};
4
5// When it can be expressed in a single line,
6// `return` and curly braces can be omitted
7const greetShort = name => "Hello, " + name;
8
9console.log(greet("Charlie")); // Hello, Charlie
10console.log(greetShort("Dave")); // Hello, Dave
この例でのgreet
とgreetShort
のように関数を宣言できます。関数が1行の場合には、greetShort
のように{}
(中括弧)を省略できます。
関数の要素
引数
関数に渡される値を引数と呼びます。関数の定義時に、引数を指定しておくことで、関数を呼び出す際に値を渡すことができます。
1function add(a, b) {
2 return a + b;
3}
4
5console.log(add(2, 3)); // 5
デフォルト引数
引数に値が渡されなかった場合に、デフォルト値を指定することができます。
1function greet(name = "Guest") {
2 return "Hello, " + name;
3}
4
5console.log(greet()); // Hello, Guest
6console.log(greet("Alice")); // Hello, Alice
この例では、greet()
の場合、デフォルトのGuest
が使われます。
戻り値
return
文を使って関数から戻り値を返すことができます。return
文がない場合、関数はundefined
を返します。
1function greet(name) {
2 console.log('Hello, ' + name + '!');
3}
4function square(num) {
5 return num * num;
6}
7
8console.log(square(4)); // 16
9console.log(greet('Alice')); // undefined
この例でのgreet
は値を返さないため、戻り値はundefined
となります。
無名関数
名前を持たない関数のことを無名関数といいます。関数式やアロー関数として使われることが多いです。
1const double = function(num) {
2 return num * 2;
3};
4
5console.log(double(5)); // 10
即時実行関数(IIFE: Immediately Invoked Function Expression)
即時実行関数(IIFE)は、定義と同時に実行される関数です。通常、スコープを制御するために使われます。
1/* Example of IIFE: Immediately Invoked Function Expression */
2(function() {
3 console.log("This is an IIFE");
4})(); // This is an IIFE
このように宣言と同時に実行されます。
コールバック関数
関数を引数として他の関数に渡し、その関数が後で実行することをコールバック関数といいます。非同期処理やイベント処理で頻繁に使われます。
1function processData(callback) {
2 let data = "Processed Data";
3 callback(data);
4}
5
6processData(function(result) {
7 console.log(result); // Processed Data
8});
この例では、コールバック関数としてコンソールに値を出力する関数を渡しています。
再帰関数
関数が自分自身を呼び出すことを再帰といい、これを利用して繰り返し処理を行う関数を再帰関数と呼びます。例えば、階乗(factorial)を求める関数は次のように再帰で実装できます。
1function factorial(n) {
2 if (n === 0) {
3 return 1;
4 } else {
5 return n * factorial(n - 1);
6 }
7}
8
9console.log(factorial(5));
10// Output : 120
11// (5 * 4 * 3 * 2 * 1 = 120)
この例では、5
の階乗である120
が表示されます。
this
キーワード
関数内で使われるthis
は、その関数がどのオブジェクトを指しているかを表します。通常の関数では呼び出し元のオブジェクトを指しますが、アロー関数では定義時のスコープにおけるthis
を保持します。
1const obj = {
2 name: "Alice",
3 greet: function() {
4 console.log(this.name); // Refers to "Alice"
5 }
6};
7
8obj.greet(); // Alice
9
10const obj2 = {
11 name: "Bob",
12 greet: () => {
13 // Arrow function refers to the outer scope (undefined here)
14 console.log(this.name);
15 }
16};
17
18obj2.greet(); // undefined
obj
変数のgreet
はfunction
キーワードによって宣言されています。そのため、this
キーワードはobj
変数のオブジェクトを指します。一方、obj2
変数のgreet
はアロー関数によって宣言されています。そのため、this
キーワードは外側のスコープのオブジェクトを参照し、この例ではundefined
になります。
関数スコープとクロージャ
関数内で定義された変数は、関数外からアクセスできません。これを関数スコープといいます。また、関数が定義された時点のスコープを保持するクロージャという機能があります。
1function outer() {
2 let outerVar = "I am outer!";
3
4 function inner() {
5 console.log(outerVar); // Can access outerVar
6 }
7
8 return inner;
9}
10
11const innerFunc = outer();
12innerFunc(); // I am outer!
この例では、inner
関数は、関数が定義された時点のスコープを保持するため、outerVar
変数にアクセスできます。
まとめ
- 関数宣言、関数式、アロー関数など、さまざまな定義方法があります。
- 関数は引数を受け取り、戻り値を返すことができます。
- コールバック関数や再帰関数など、特別な使い方があります。
this
の扱いに注意が必要で、アロー関数と通常の関数では挙動が異なります。- クロージャを利用して、スコープの外側から内部の変数にアクセスすることができます。
関数は、JavaScriptの柔軟な構造を活かした重要な概念の1つです。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。