カテゴリ: JavaScript 更新日: 2026/07/06

JavaScriptクロージャー入門!変数を隠すテクニックで安全なプログラムを作ろう

JavaScriptのクロージャーで変数を隠すテクニックを解説
JavaScriptのクロージャーで変数を隠すテクニックを解説

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

生徒

「先生、JavaScriptで変数を隠すってどういうことですか?」

先生

「変数を隠すとは、他のコードから直接触れられないようにすることです。クロージャーを使うとそれが簡単にできます。」

生徒

「クロージャーって聞いたことがありますけど、難しそうです…。」

先生

「安心してください。順を追ってわかりやすく説明します。まずはクロージャーの基本から見ていきましょう。」

1. クロージャーとは何か?

1. クロージャーとは何か?
1. クロージャーとは何か?

JavaScriptのクロージャーとは、関数の中で定義した変数を、その関数の外から直接アクセスできないようにする技術です。簡単に言うと、「秘密の箱」を作るようなものです。箱の中の物は外から直接見えませんが、箱に付属した鍵(関数)を通して操作できます。

クロージャーを使うと、変数の値を勝手に変更されるリスクを減らすことができ、プログラムを安全に保つことができます。

2. 基本的なクロージャーの例

2. 基本的なクロージャーの例
2. 基本的なクロージャーの例

まずは簡単な例を見てみましょう。内部の変数を隠して、関数を通してだけアクセスできるようにします。


function createCounter() {
  let count = 0; // この変数は外から直接見えない
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

ここで、countは外から触れません。counter()関数を通じてのみ値を増やせます。これがクロージャーの基本的な使い方です。

3. クロージャーで変数を隠すメリット

3. クロージャーで変数を隠すメリット
3. クロージャーで変数を隠すメリット

変数を隠すことで、以下のようなメリットがあります。

  • 他の関数やコードから意図せず変更されるのを防げる
  • コードの安全性が高まり、バグを減らせる
  • 変数のスコープを明確にして管理しやすくなる

例えば、ゲームのスコアやアプリの設定値など、外部から勝手に変えられたくない値に有効です。

4. クロージャーを使った複数の関数での共有

4. クロージャーを使った複数の関数での共有
4. クロージャーを使った複数の関数での共有

クロージャーを使うと、同じ隠れた変数を複数の関数で共有できます。次の例を見てみましょう。


function createBankAccount(initialBalance) {
  let balance = initialBalance; // 外から直接見えない

  return {
    deposit: function(amount) {
      balance += amount;
      return balance;
    },
    withdraw: function(amount) {
      balance -= amount;
      return balance;
    }
  };
}

const account = createBankAccount(1000);
console.log(account.deposit(500));  // 1500
console.log(account.withdraw(200)); // 1300

ここでは、balanceという変数を外から直接変更できません。depositwithdrawという関数を通じてのみ操作できます。

5. 即時関数とクロージャーで変数を隠す

5. 即時関数とクロージャーで変数を隠す
5. 即時関数とクロージャーで変数を隠す

クロージャーは即時実行関数(IIFE: Immediately Invoked Function Expression)と組み合わせるとさらに便利です。グローバル変数を汚さずに、変数を隠せます。


const module = (function() {
  let secret = "隠された情報";

  return {
    getSecret: function() {
      return secret;
    }
  };
})();

console.log(module.getSecret()); // "隠された情報"
console.log(module.secret);      // undefined

外からsecretにはアクセスできませんが、getSecret()を通して値を取得できます。

6. クロージャーでカウンターの複数インスタンスを作る

6. クロージャーでカウンターの複数インスタンスを作る
6. クロージャーでカウンターの複数インスタンスを作る

クロージャーを使うと、同じコードから複数の独立したカウンターを作ることができます。


function createIndependentCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}

const counterA = createIndependentCounter();
const counterB = createIndependentCounter();

console.log(counterA()); // 1
console.log(counterA()); // 2
console.log(counterB()); // 1
console.log(counterB()); // 2

それぞれのカウンターが独立しているので、変数が混ざることはありません。

7. クロージャーを安全に使うコツ

7. クロージャーを安全に使うコツ
7. クロージャーを安全に使うコツ

クロージャーは便利ですが、使い方を間違えるとメモリを無駄に消費することがあります。安全に使うコツは以下の通りです。

  • 必要な変数だけをクロージャー内に置く
  • 使い終わった関数やオブジェクトをnullにして参照を解放する
  • 過剰にネストしたクロージャーは避ける

これらを守ると、安全で効率的なクロージャーを作ることができます。

8. クロージャーのまとめ

8. クロージャーのまとめ
8. クロージャーのまとめ

クロージャーは、JavaScriptで変数を隠すための強力な技術です。関数内の変数を外部から直接操作できないようにし、関数を通じてのみアクセス可能にします。これにより、プログラムの安全性と管理性が向上します。

今回紹介した例では、カウンターや銀行口座、モジュールパターンなどでクロージャーを活用しました。初心者でも、まずは小さな関数からクロージャーを試すと理解しやすくなります。

クロージャーを習得することで、JavaScriptのプログラム設計がより安全で柔軟になり、他の開発者と協力しても安心してコードを書けるようになります。

まとめ

まとめ
まとめ

JavaScriptのクロージャーは、変数のスコープ管理と安全なプログラム作りに欠かせない技術です。クロージャーを使うことで、関数内で定義した変数を外部から直接操作されないように隠すことができ、プログラムの安全性を高めることができます。基本的な使い方は、関数を返す関数を作り、その内部で変数を定義して、返された関数を通じてのみ変数にアクセスするというパターンです。これにより、意図しない変更やバグを防ぎつつ、状態を保持したり、複数の独立したインスタンスを作ることが可能です。

クロージャーは、単純なカウンターや合計値の管理だけでなく、銀行口座の入出金管理、モジュールパターンでのデータ隠蔽など、幅広い場面で活用できます。特に、即時関数(IIFE)と組み合わせることで、グローバルスコープを汚さずに安全な変数管理ができる点も大きな利点です。また、複数の関数で同じ変数を共有する場合や、独立した複数のインスタンスを作りたい場合も、クロージャーを使うことで効率的に実現可能です。

クロージャーを使う上での注意点としては、必要以上に変数や関数をネストさせないこと、使用後は参照を解放してメモリ管理に注意すること、そして不要な変数をクロージャーに含めないことです。これらを守ることで、パフォーマンスの良い安全なクロージャーを作ることができます。初心者は、まず小さな関数でカウンターを作るなど簡単な例から始めると理解しやすく、徐々に銀行口座やモジュールのような実践的な例に進むとスムーズです。

クロージャーの基本例


function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

このように、countは外部から直接アクセスできず、counter()を通じてのみ操作可能です。シンプルながら、クロージャーの核心を理解するのに最適です。

複数インスタンスの例


const counterA = createCounter();
const counterB = createCounter();

console.log(counterA()); // 1
console.log(counterA()); // 2
console.log(counterB()); // 1
console.log(counterB()); // 2

この例では、counterAcounterBが独立して動作します。それぞれの内部状態がクロージャーによって隠されており、互いに干渉しません。これにより、状態管理が簡単になり、コードの安全性が高まります。

モジュールパターンの例


const module = (function() {
  let secret = "隠された情報";

  return {
    getSecret: function() {
      return secret;
    }
  };
})();

console.log(module.getSecret()); // "隠された情報"
console.log(module.secret);      // undefined

モジュールパターンを使うことで、グローバルスコープを汚さず、必要な関数だけを公開できます。これにより、より安全で保守性の高いコードが書けます。

先生と生徒の振り返り会話

生徒

「先生、クロージャーを使うと変数を隠せるのはわかりました。でも、どうして他の関数に影響されないんですか?」

先生

「それは、クロージャーが変数を関数のスコープ内に閉じ込めるからです。外からは直接アクセスできず、返された関数を通じてのみ操作できます。だから他の関数の影響を受けません。」

生徒

「なるほど。じゃあ、同じ関数から作った複数のカウンターも独立して動くんですね。」

先生

「そうです。クロージャーごとに独自のスコープが作られるので、counterAcounterBはそれぞれ別の状態を持ちます。」

生徒

「モジュールパターンもクロージャーを使っているんですね。これなら外部に秘密の情報を渡さずに関数だけを公開できる。」

先生

「その通りです。クロージャーを理解すれば、変数を安全に管理でき、コードの保守性や安全性が飛躍的に向上します。小さな例から試して、徐々に応用例に挑戦するとよいでしょう。」

カテゴリの一覧へ
新着記事
New1
JavaScript
JavaScriptのスコープとは?ローカル変数・グローバル変数の違いと使い分け
New2
TypeScript
TypeScriptで型の合成時に発生する型エラーの対処法を徹底解説!初心者にもわかりやすく解説
New3
TypeScript
TypeScriptでAPI呼び出しをラップするユーティリティ関数の設計完全ガイド!初心者向けにAxiosやFetchの使い方を解説
New4
TypeScript
TypeScriptのMapped Typesとインターフェースの連携方法を徹底解説!初心者でも理解できる型変換の基本
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptのループで無限ループが起きる原因と対策を初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.3
Java&Spring記事人気No3
JavaScript
JavaScriptの文字列の長さを取得する(lengthプロパティ)
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptのファイル分割とimport/exportの基本を徹底解説!初心者でも安心のやさしい入門
No.5
Java&Spring記事人気No5
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのプリミティブ型と参照型の違いを初心者向けに解説
No.7
Java&Spring記事人気No7
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
No.8
Java&Spring記事人気No8
TypeScript
TypeScriptでパスエイリアスを設定する方法!baseUrlとpathsでコードをスッキリ整理