【くろーじゃ】
クロージャ とは?
最終更新:
💡 関数が、生まれた場所の変数に手を伸ばせる
関数と、その関数が定義された場所の変数を参照する環境の組み合わせ。外側の関数の実行が終わっても、その変数を使える。JavaScriptでは関数を作るときに形成される。
📌 このページのポイント
- 関数と、定義された場所の変数を参照する環境の組み合わせ
- 外側の関数が終わっても、必要な変数を使える
- カウンターやイベントのコールバックなどで役立つ
- JavaScriptでは値の固定コピーではなく、変数への参照を持つ
クロージャって、特別な種類の関数なの?
JavaScriptでは、関数を作るときに形成されるよ。関数本体と、定義された場所の変数を参照する環境を合わせたものなんだ。外側の関数が実行を終えても、そこにあった変数を後で使えるのが分かりやすい例だね。
カウンターにすると、どうなるの?
makeCounterの中でlet count = 0を用意し、countを1増やして返す関数を戻すとするよ。その戻り値をcounterとして呼ぶと、counter()は1、次は2になる。呼ぶたびに同じcountへアクセスできるから、数を覚えていられるんだ。
もう一つカウンターを作ったら、数は一緒?
makeCounterをもう一度呼んで作れば、別の環境のcountを使うよ。一方で、1回の呼び出しから複数の関数を返すと、それらが同じ変数を共有することもある。関数が何個あるかだけで、変数が別々とは決まらないんだ。
変数のコピーを保存しているわけではない?
JavaScriptでは、変数を参照する環境を保持するよ。だから共有する変数を書き換えると、後で関数を呼んだときの結果にも反映される。作った瞬間の値を写真のように固定する、と考えると間違えやすいんだ。
ループでletを使うと、共有を避けられる?
まとめ:ざっくりこれだけ覚えればOK!
「クロージャ」って出てきたら「作られた場所の変数を使い続けられる関数」と思えばだいたいOK!
📖 おまけ:英語の意味
「Closure」 = 閉包
💬 関数が外側の変数を取り込んだ環境と組になることを表す呼び名だよ。「値をその時点のまま閉じ込める」という意味ではないんだ。