
// 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を入れない処理」に分類されるわけです。
この「画面を変える処理」と「計算する処理」を組み合わせて、「もし計算結果がマイナスなら背景を赤にする」といったコードを書いてみますか?
コメントを残す