カテゴリ: JavaScript 更新日: 2025/09/24

JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう

JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう
JavaScriptの純粋関数(pure function)と副作用の違いを理解しよう

先生と生徒の会話形式で理解しよう

生徒

「先生、JavaScriptで『純粋関数』って何ですか?あと『副作用』って言葉もよく聞くのですが、どう違うんですか?」

先生

「いい質問ですね。純粋関数とは、決まった入力に対して必ず同じ結果を返し、プログラムの外に影響を与えない関数のことです。一方、副作用はその関数が外の世界に変化を与えることを指します。」

生徒

「もう少しわかりやすい例えとか、具体的な違いを教えてください!」

先生

「もちろんです。実際のコードも交えてゆっくり説明しますね。」

1. 純粋関数(pure function)とは?

1. 純粋関数(pure function)とは?
1. 純粋関数(pure function)とは?

純粋関数とは、次の2つのルールを守る関数のことです。

  • 同じ入力には必ず同じ結果を返す
  • 関数の外側の状態を変えたり、影響を与えたりしない

このルールを守ることで、関数の動きが予測しやすくなり、バグを減らしやすくなります。

例を見てみましょう。


function add(a, b) {
  return a + b;
}

console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5(何度呼んでも結果は同じ)

このadd関数は純粋関数です。2と3を渡せば必ず5を返し、外の世界には影響を与えません。

2. 副作用(side effect)とは?

2. 副作用(side effect)とは?
2. 副作用(side effect)とは?

副作用とは、関数が外の世界に何か影響を与えることです。例えば、画面に文字を表示したり、ファイルを書き換えたり、変数の値を変更したりすることです。

副作用のある関数は同じ入力でも結果が変わったり、プログラムの状態を変えたりします。

例を見てみましょう。


let counter = 0;

function increment() {
  counter = counter + 1;  // 外の変数を変えているので副作用がある
  console.log("カウンターは " + counter);
}

increment(); // カウンターは 1
increment(); // カウンターは 2

このincrement関数は副作用があります。関数を呼ぶたびに外のcounter変数の値が変わるからです。

3. 純粋関数と副作用の違いを簡単な例えで説明

3. 純粋関数と副作用の違いを簡単な例えで説明
3. 純粋関数と副作用の違いを簡単な例えで説明

純粋関数は「いつも同じ味のクッキーを作るレシピ」です。材料(入力)が同じなら必ず同じクッキー(結果)ができます。

副作用のある関数は「クッキーを作ると同時に、キッチンのテーブルも散らかすレシピ」です。クッキーは作れるけど、キッチンの状態も変わります。

プログラムでは、副作用があると予測が難しくなり、問題が起こりやすいです。

4. 純粋関数のメリット

4. 純粋関数のメリット
4. 純粋関数のメリット
  • 結果が予測しやすい
  • バグが少なく、テストもしやすい
  • 関数を安全に再利用できる

プログラムをわかりやすく保つために、できるだけ純粋関数を使うことが推奨されます。

5. 副作用のある関数を使う場合の注意点

5. 副作用のある関数を使う場合の注意点
5. 副作用のある関数を使う場合の注意点

副作用は完全に悪いわけではありません。例えば、画面に表示したり、ファイルを保存したりするには副作用が必要です。

ただし、副作用を起こす関数はプログラムのどこで使われているかをよく理解し、管理することが大切です。

6. 純粋関数と副作用を意識したコード例

6. 純粋関数と副作用を意識したコード例
6. 純粋関数と副作用を意識したコード例

純粋関数で計算だけを行い、副作用は別の関数で行う例です。


// 純粋関数
function multiply(a, b) {
  return a * b;
}

// 副作用のある関数
function showResult(result) {
  console.log("計算結果は " + result);
}

// 使い方
const result = multiply(5, 3);
showResult(result);

計算は純粋関数で行い、画面表示は副作用のある関数で分けることで、プログラムが整理しやすくなります。

カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptとESNextの連携を完全ガイド!最新機能を使いこなす設定と対応法
New2
JavaScript
JavaScriptの正規表現で任意の1文字(.)や文字クラスを使う方法
New3
TypeScript
TypeScriptで非同期イテレーター(for await of)を活用する
New4
TypeScript
TypeScriptで「Hello World」を出力する手順と解説
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptの日時操作Tips!実務で役立つテクニック集
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptプログラムの実行方法まとめ!ブラウザ・Node.js・コンソールの使い方
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptでESLintとPrettierを導入!コード整形ルールを自動で統一する方法
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptのif文の使い方を完全ガイド!初心者でもわかる条件分岐
No.6
Java&Spring記事人気No6
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptの配列の要素にアクセスする方法(インデックス番号の使い方)
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptの型を明確に設計するコツとチーム開発の指針