📖 もうちょい詳しく
何が新しいの?
ふつう関数は、呼び出されて仕事が終わると、その中で使った変数(データを入れておく名札)は消えてしまいます。クロージャは、関数が「自分が作られたときの周りの変数」をそのまま覚えておける仕組みです。おかげで、関数が外に持ち出されても、生まれた場所の状態を連れて歩けます。
どうやって動いてるの?
関数を作ると、その関数は「自分の外側にあった変数」への通り道をいっしょに抱えます。あとでその関数を別の場所で呼び出しても、覚えていた変数を読んだり書き換えたりできます。関数本体と、その関数が見ていた周りの変数たちを、ひとまとめにしたものがクロージャです。
何ができるの?
たとえば「呼ばれるたびに1ずつ増えるカウンター」を、外から数字を触れない形でしまっておけます。ボタンが押されたあとに動く処理(コールバック)に、押した時点の値を覚えさせるのにも使われます。設定だけ先に渡して、あとで実行する関数を作るときにも便利です。
🌱 身近なたとえ
鍵のかかった引き出しと、その引き出しを開けられる人で例えると分かりやすいです。引き出し(変数)の中身は外からは見えませんが、担当の人(関数)だけは中を出し入れできます。担当の人を別の部屋へ移しても、その人はちゃんと自分の引き出しを覚えていて、いつでも開けられます。中身を直接いじられないので、状態を安全にしまっておけます。
✅ まず覚えるポイント
- クロージャ=「関数」+「その関数が覚えている周りの変数」のセットです。
- 関数が作られた場所の変数を、あとからでも読み書きできます。
- ふつうは消えるはずの変数を、生かしたまま持ち歩けます。
- 外から直接触れない「閉じた状態」を作れます。
- カウンターや設定の保持、コールバックでよく登場します。
- JavaScriptをはじめ、多くの言語で使える考え方です。
🧭 よくある勘違い
クロージャって特別な書き方が必要なの?
専用の命令があるわけではないことが多いです。関数の中で関数を作り、外側の変数を使うと、自然にクロージャになります。意識しないうちに使っていることもよくあります。
覚えているのは「値のコピー」なの?
コピーではなく、変数そのものへの通り道を覚えています。なので、あとでその変数の中身が変われば、クロージャから見える値も変わります。スナップショット(その瞬間の写し)ではない点に注意です。
グローバル変数と何が違うの?
グローバル変数は誰でも触れますが、クロージャの変数は外から直接さわれません。特定の関数だけがアクセスできるので、安全に状態を閉じ込められるのが違いです。
🧩 関連して覚えると楽な言葉
- 関数(function): ひとまとまりの処理に名前を付けて、何度でも呼び出せるようにしたものです。
- オブジェクト指向(object-oriented): 関わりのあるデータと操作を「モノ」ひとつにまとめる考え方です。状態を外から触れない形で閉じ込める発想が、クロージャと近いです。
- 変数(variable): データを入れておく名札付きの箱のことです。
- コールバック(callback): あとで実行してほしい処理を、関数として渡しておく仕組みです。
🏁 ひとことでまとめ
関数が、自分の生まれた場所の変数をかばんに入れて持ち歩ける仕組み。それがクロージャです。
TERM SEARCH
ほかの用語を調べる
検索ボックスを準備中…