カテゴリ: JavaScript 更新日: 2026/05/15

JavaScriptのクロージャー完全ガイド!初心者でもわかる仕組みと基本

JavaScriptのクロージャーとは?仕組みと基本をやさしく解説
JavaScriptのクロージャーとは?仕組みと基本をやさしく解説

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

生徒

「先生、JavaScriptでよく『クロージャー』って聞くんですけど、何のことですか?」

先生

「クロージャーとは、関数とその関数が作られたときの変数の環境をセットにしたものです。簡単に言うと、関数の中で作った変数を外からも覚えて使えるようにする仕組みですね。」

生徒

「えーと、関数の中の変数って普通は外から見れないですよね?どうして覚えていられるんですか?」

先生

「良い質問です。JavaScriptでは関数を返すときに、その関数が作られたときの変数の情報も一緒に保持するんです。だから、関数が外で呼ばれても中の変数を覚えて使えるんですよ。」

1. クロージャーとは何か?基本のイメージ

1. クロージャーとは何か?基本のイメージ
1. クロージャーとは何か?基本のイメージ

JavaScriptのクロージャーは、関数とその関数が作られた時のスコープ(変数環境)を覚えておく仕組みです。スコープとは、変数や関数がどこからアクセスできるかを決める範囲のことです。クロージャーを使うと、関数の中で作った変数を関数外でも使えるようになります。


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

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

この例では、makeCounterの中で作ったcountという変数が、返された関数counterによって覚えられています。

2. なぜクロージャーは便利なのか?

2. なぜクロージャーは便利なのか?
2. なぜクロージャーは便利なのか?

クロージャーを使うと、変数を関数の外から直接触れないようにできるので、安全にデータを管理できます。これは「データの隠蔽」とも呼ばれ、プログラムのバグを減らすのに役立ちます。


function createSecret(secret) {
  return function() {
    return secret;
  };
}

const getSecret = createSecret("パスワード");
console.log(getSecret()); // パスワード

この例では、secretは外から直接アクセスできませんが、返された関数を通じて取り出せます。

3. クロージャーの仕組みをやさしく理解する

3. クロージャーの仕組みをやさしく理解する
3. クロージャーの仕組みをやさしく理解する

クロージャーの仕組みをイメージすると、関数とその関数が作られたときの「箱」を一緒に持ち歩いている感じです。関数が呼ばれたとき、その箱に入った変数を使うことができます。


function outer() {
  let message = "こんにちは";
  function inner() {
    console.log(message);
  }
  return inner;
}

const sayHello = outer();
sayHello(); // こんにちは

ここでは、inner関数がmessageを覚えているので、外で呼んでも表示できます。

4. クロージャーと変数スコープの関係

4. クロージャーと変数スコープの関係
4. クロージャーと変数スコープの関係

クロージャーはスコープの仕組みと深く関係しています。関数の中で作った変数は通常、その関数の外からは見えません。しかし、クロージャーを使うとその変数を保持したまま別の関数に渡すことができます。


function counterFactory() {
  let count = 0;
  return {
    increment: function() { count++; },
    getCount: function() { return count; }
  };
}

const counterObj = counterFactory();
counterObj.increment();
console.log(counterObj.getCount()); // 1

このように、countは外から直接変更できませんが、関数を通じて安全に操作できます。

5. クロージャーでよくあるパターン

5. クロージャーでよくあるパターン
5. クロージャーでよくあるパターン

クロージャーはカウンターや秘密情報の管理のほか、関数を動的に作るときにも使われます。例えば、関数を生成して設定を保持するパターンです。


function makeAdder(x) {
  return function(y) {
    return x + y;
  };
}

const add5 = makeAdder(5);
console.log(add5(3)); // 8

この例では、xという値を覚えた関数を作り、外からyを渡すだけで計算できます。

6. クロージャーを使うときの注意点

6. クロージャーを使うときの注意点
6. クロージャーを使うときの注意点

クロージャーを便利に使えますが、注意点もあります。変数を保持し続けるため、不要になったクロージャーをそのままにするとメモリを消費し続けます。長く使わない場合は、クロージャーを解放するか、使いすぎないようにしましょう。


function makeBigArray() {
  let bigArray = new Array(1000000).fill(0);
  return function() { return bigArray.length; };
}

const getLength = makeBigArray();
// bigArrayはクロージャーにより保持され続ける
console.log(getLength());

不要な大きなデータを閉じ込めると、メモリ消費が増えることを覚えておきましょう。

7. まとめの前に確認したいクロージャーのポイント

7. まとめの前に確認したいクロージャーのポイント
7. まとめの前に確認したいクロージャーのポイント

クロージャーは関数とその関数が作られた時の変数環境を保持する仕組みです。これにより、関数の外から見えない変数を操作したり、関数を動的に作ったりすることができます。安全にデータを管理したり、動的な関数生成を行うときに非常に便利な機能です。


function greetingMaker(name) {
  return function() {
    console.log("こんにちは、" + name + "さん!");
  };
}

const greetTaro = greetingMaker("太郎");
greetTaro(); // こんにちは、太郎さん!

このように、クロージャーを使うと、関数内の情報を外から安全に利用できるのが特徴です。

まとめ

まとめ
まとめ

JavaScriptのクロージャーは、関数とその関数が作られたときの変数環境をセットで保持する仕組みであり、関数の中で作成した変数を外から安全に操作できる非常に便利な機能です。クロージャーを理解すると、関数内のデータを隠蔽して管理できるため、プログラムのバグを減らし、より柔軟で安全なコードを書くことが可能になります。また、クロージャーはカウンターの作成や秘密情報の管理、動的な関数生成など、さまざまな用途で利用できます。クロージャーを利用する際は、不要なデータを保持し続けることでメモリを消費しすぎないように注意が必要です。クロージャーはスコープの概念と密接に関係しており、関数の外から直接触れない変数を、関数を通じて安全に操作できるのが大きな特徴です。以下にクロージャーを活用した具体例をまとめておきます。

クロージャーの基本例


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

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

関数makeCounterの中で作ったcountが返された関数により保持され、外からも安全に値を操作できます。

データ隠蔽の活用例


function createSecret(secret) {
return function() {
return secret;
};
}

const getSecret = createSecret("パスワード");
console.log(getSecret()); // パスワード

変数secretは外から直接アクセスできませんが、返された関数を通じて安全に取り出せます。これにより、外部から不正に変更されるリスクを防げます。

動的関数生成の例


function makeAdder(x) {
return function(y) {
return x + y;
};
}

const add5 = makeAdder(5);
console.log(add5(3)); // 8

この例では、関数を生成するたびにxの値を覚えておき、外から渡すyを加算できます。クロージャーを利用することで、設定値や状態を保持した関数を簡単に作成できます。

メモリ消費への注意点


function makeBigArray() {
let bigArray = new Array(1000000).fill(0);
return function() { return bigArray.length; };
}

const getLength = makeBigArray();
console.log(getLength());

大きなデータをクロージャーで保持すると、不要になってもメモリに残り続ける可能性があります。長期間使用しないクロージャーは解放するか、扱うデータ量を抑える工夫が重要です。

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

生徒

「先生、クロージャーは便利ですが、どんな場面で特に役立つんですか?」

先生

「例えば、関数ごとに異なるカウンターを作りたいときや、外部から直接触れたくない秘密情報を管理したいときに役立ちます。また、動的に関数を生成して設定値を保持したい場合も便利です。」

生徒

「なるほど、関数の中の変数を安全に管理できるんですね。でも、メモリのことも気をつけた方がいいんですか?」

先生

「その通りです。大きな配列やオブジェクトをクロージャーに保持したままにすると、不要になってもメモリに残ることがあります。使わなくなったクロージャーは適切に解放するか、データ量を抑えて使うことが大切です。」

生徒

「わかりました。クロージャーを使うことで、関数の外から直接アクセスできない変数を安全に扱えて、バグも減らせるんですね。」

先生

「その通りです。クロージャーを正しく理解すると、データの隠蔽や動的な関数生成など、さまざまな場面で役立ちます。初心者でもまずはカウンターや秘密情報の例から試してみると理解が深まりますよ。」

カテゴリの一覧へ
新着記事
New1
TypeScript
TypeScriptの関数に型をつける方法(引数・戻り値)を初心者向けに徹底解説!
New2
TypeScript
TypeScriptの始め方:開発環境の構築手順【初心者向け】
New3
TypeScript
TypeScriptでExpressのミドルウェアを型安全に定義する方法!バックエンド開発の初心者向け解説
New4
JavaScript
JavaScriptのfilterメソッドで条件に合う要素を抽出する方法
人気記事
No.1
Java&Spring記事人気No1
JavaScript
JavaScriptでフォームの値を取得する方法を徹底解説!valueプロパティの使い道
No.2
Java&Spring記事人気No2
JavaScript
JavaScriptでHTML5バリデーションAPIを使いこなす!初心者でもわかるフォーム入力チェック
No.3
Java&Spring記事人気No3
TypeScript
TypeScript学習におすすめの無料教材・リファレンスサイト【初心者向け】
No.4
Java&Spring記事人気No4
TypeScript
TypeScriptでコメントを書く正しい書き方と使い分け【初心者向けにやさしく解説】
No.5
Java&Spring記事人気No5
JavaScript
JavaScriptで要素を削除する方法(removeChild, removeなど)
No.6
Java&Spring記事人気No6
JavaScript
JavaScriptのインストール方法まとめ!Windows・Mac・Linux別にステップ解説
No.7
Java&Spring記事人気No7
JavaScript
JavaScriptの現在日時を取得する方法を完全ガイド!初心者でもわかるDate.now()とnew Date()
No.8
Java&Spring記事人気No8
JavaScript
JavaScriptでオブジェクト指向のカプセル化を学ぶ!初心者でもわかるクラスとプロパティの保護方法