ふわふわした理解の関数内のreturn【Day24 of 100】

// 2つの数を足し算する関数
function add(x, y) {
return x + y; // 計算結果を返す
}

// 関数の戻り値を変数に保存
let result = add(10, 5);
console.log(result); // 15

この場合returnを入れないとだめなの?

let result = x+y;
を関数内に書いて

console.log(add(x,y));
じゃだめなの?

結論から言うと、**「計算結果を関数の外で使いたい」のであれば、`return` は絶対に必要です。**

もし `return` を書かないと、関数は計算した結果を自分の中に抱え込んだまま終了してしまい、呼び出した側(外側)には何も渡されません。

なぜダメなのか、2つのパターンで比較してみましょう。

---

### 1. `return` がない場合(うまくいかない例)

ご質問のように、関数の中で変数に代入するだけで `return` を書かないとこうなります。

```javascript
function add(x, y) {
    let result = x + y; 
    // ここで return していない!
}

let finalResult = add(10, 5);
console.log(finalResult); // 結果は 「undefined(未定義)」になる

```

* **理由:** `let result = x + y;` という計算は関数の中で行われていますが、その結果を「外に放り出す(返す)」という命令がないため、外側の変数 `finalResult` は空っぽの状態になってしまいます。

---

### 2. 関数内で `console.log` をする場合(表示はできるが不便な例)

「外に返さなくても、中で表示しちゃえばいいじゃない」と思うかもしれません。

```javascript
function add(x, y) {
    console.log(x + y); 
}

add(10, 5); // 15 と表示はされる

```

これなら動いているように見えますが、**「その計算結果をさらに別の計算に使いたい」**ときに困ります。

> **例:** 10と5を足した結果に、さらに100を掛けたい場合
> * **returnがある:** `let res = add(10, 5) * 100;` (できる!)
> * **returnがない:** `add(10, 5)` の結果が外で使えないので、計算が続けられない。
> 
> 

---

### わかりやすいイメージ:おつかい

関数を「買い物(おつかい)」に例えるとわかりやすいです。

* **引数(x, y):** お金と買い物メモを渡す。
* **関数内の処理:** お店で商品を買う。
* **return:** **買ってきた商品を家(外)に持ち帰る。**

もし `return` がないのは、**「買い物には行ったけれど、買ってきたものを店に置き忘れて手ぶらで帰ってきた」**という状態と同じです。これでは家で料理(次の処理)ができませんよね。

### まとめ

* `return` は、関数の外に **「結果を報告する」** ための窓口です。
* 結果を別の変数に入れたり、さらに計算に使いたいなら必ず必要になります。

もしよろしければ、この `result` を使ってさらに別の計算(消費税計算など)をしてみるコードを一緒に書いてみましょうか?

関数ってretrunを入れない処理も多くない?ではあれ意味あるの?

おっしゃる通りです!実は、プログラミングの世界では **「returnを書かない関数」も非常にたくさん使われます。**

鋭い視点ですね。これらは役割が根本的に違います。専門用語を交えつつ、わかりやすく整理しますね。

---

### 1. return が「いらない」関数(副作用のための関数)

return を書かない関数は、何かを「計算して返す」のが目的ではなく、**「何かを実行して状況を変える」**のが目的です。これをプログラミングでは **「副作用(Side Effect)」** と呼んだりします。

**よくある例:**

* **画面に文字を出す:** `console.log()`
* **アラートを出す:** `alert("こんにちは")`
* **背景色を変える:** `document.body.style.backgroundColor = "red"`
* **データを保存する:** データベースに書き込む処理

これらは「実行すること自体」が目的なので、わざわざ結果を報告(return)してもらう必要がないのです。

---

### 2. return が「ある」関数(計算・加工のための関数)

一方で、return を書く関数は、**「部品」**としての役割が強いです。

**よくある例:**

* **計算:** 合計金額を出す、消費税を計算する
* **判定:** パスワードが正しいかチェックして `true` か `false` を返す
* **加工:** 文字列を短く切り取る

これらは、返ってきた結果を使って「さらに次の処理」をしたいときに使います。

---

### 結局、どう使い分けるの?

「料理」に例えるとスッキリします。

| 種類 | 役割 | returnの有無 | 例 |
| --- | --- | --- | --- |
| **加工・調理** | 材料を渡して「切った野菜」をもらう | **必要** | 食材をカットする関数、味付けを計算する関数 |
| **アクション** | 出来上がった料理を「テーブルに運ぶ」 | **不要** | 配膳する関数、皿を洗う関数 |

* **もし配膳する関数に return があったら:** 「はい、配膳してきました!」という報告書が返ってきますが、それを受け取っても「あ、そう。ありがとう」で終わりですよね。報告書(return)がなくても、料理がテーブルにあれば目的は達成されています。

---

### まとめ:意味はあるの?

**「その関数の結果を、次のステップで使いたいかどうか」** で決まります。

1. **次のステップで使いたい:** `return` を書いて、結果をバトンタッチする。
2. **そこで完結していい:** `return` は書かず、実行するだけで終わり。

「add関数」の場合、足し算したあとに「その数字を使ってさらに引き算したい」「画面に表示したい」など、**結果を使い回す可能性が高い**ため、一般的には `return` を書くのがマナー(使い勝手が良い設計)とされています。

次は、returnを使って「もし合計が1000円以上なら送料無料にする」といった、少し実践的な条件分岐のコードを書いてみませんか?

​背景色を変える: document.body.style.backgroundColor = “red”

これも赤という状況変化を返してるんじゃないの?

非常に鋭いツッコミですね!その感覚はプログラミングの深い部分に触れています。

結論から言うと、**「見た目の変化(状態の変化)」**と**「プログラム上の値の返却(return)」**は、JavaScriptの世界では明確に区別されています。

言葉の定義を整理すると、スッキリするかもしれません。

---

### 1. 「状況の変化」と「戻り値」の違い

* **状況の変化(副作用):**
画面が赤くなる、音が鳴る、ファイルが保存される。これらは「現実世界(ブラウザの画面)」に対する影響です。
* **戻り値(return):**
関数が計算を終えたあと、**呼び出し元のコードに渡される「データ」**のことです。

ご質問のコードで考えてみましょう。

```javascript
function changeColor() {
    document.body.style.backgroundColor = "red";
}

let result = changeColor();
console.log(result); // undefined (何も返ってこない)

```

このとき、画面は確かに**赤く**なります。しかし、変数 `result` の中身は空っぽ(undefined)です。
つまり、**「画面は変えたけれど、次のプログラムに渡すバトン(データ)は何も持っていない」**という状態なのです。

---

### 2. もしこれを `return` ありにするなら?

もし「赤に変えた」という状況をプログラムでも活用したいなら、あえて `return` を書くこともあります。

```javascript
function changeColor() {
    document.body.style.backgroundColor = "red";
    return "背景を赤に変えました!"; // 報告(データ)を返す
}

let message = changeColor();
console.log(message); // "背景を赤に変えました!" と表示される

```

このように書けば、画面を赤くした上で、その報告を `message` という変数で受け取ることができます。

---

### 3. なぜ return なしの関数が多いのか

多くの「背景を変える」「文字を出す」といった関数で `return` が省略されるのは、**「画面が変わったなら、それで目的達成。わざわざ報告(データ)をもらわなくても次に進めるから」**という理由がほとんどです。

* **add(x, y) の場合:** 数値という「データ」が手に入らないと、その後の計算ができないので `return` が必須。
* **背景変更の場合:** 画面が変わることが目的なので、その後の処理で「何色に変えたか」という情報をプログラムが再利用する必要がなければ、`return` は不要。

### まとめ

* **画面が変わること:** 「副作用(実行結果)」
* **return:** 「戻り値(次のコードに渡すデータ)」

「背景を変える」という処理は、画面(副作用)には影響を与えていますが、**プログラムの変数(戻り値)には何も返していない**ので、「returnを入れない処理」に分類されるわけです。

この「画面を変える処理」と「計算する処理」を組み合わせて、「もし計算結果がマイナスなら背景を赤にする」といったコードを書いてみますか?

コメントを残す

猫でデザインとプログラミングを学ぶをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む