クロージャ(Closure)

**クロージャ(Closure)は、関数型プログラミングにおいて非常に重要な概念の一つであり、「関数とその関数が定義されたスコープ(環境)を合わせたもの」**です。


1. 基本的な定義

クロージャとは、
**「自由変数(自分のスコープ内で定義されていない変数)を捕捉(キャプチャ)して記憶する関数」**のことです。
言い換えれば、関数が定義されたときのスコープにある変数への参照を保持し続ける関数です。


2. 仕組みの概要

通常、関数内で使用される変数は、その関数が終了すると消滅します。しかし、クロージャは次の特徴を持っています:

  • 関数が定義された外側の変数(自由変数)を記憶する。

  • その変数は、関数が呼び出された後も保持される

  • よって、関数の外側にある変数にアクセスできる関数オブジェクトが生成される。


3. 具体例(JavaScriptを例に)

javascript
function makeCounter() { let count = 0; return function() { count++; return count; }; } const counter1 = makeCounter(); console.log(counter1()); // 1 console.log(counter1()); // 2 const counter2 = makeCounter(); console.log(counter2()); // 1

解説

  • makeCounter関数は内部にcountというローカル変数を持ちます。

  • makeCounterが呼び出されると、内部の無名関数(クロージャ)を返します。

  • そのクロージャはcountを参照し続けるため、makeCounterが終了してもcountは破棄されません。

  • counter1()を呼び出すたびにcountが更新されます。


4. 関数型プログラミングにおける意義

  • 状態を閉じ込めることで、グローバル変数を使わずに状態管理が可能

  • 副作用を局所化でき、純粋関数に近い設計が可能。

  • 関数を第一級オブジェクトとして扱う言語では、クロージャは高階関数やカリー化、部分適用などと組み合わされて利用される。


5. 他の言語での対応

多くの関数型言語や関数型の要素を持つ言語(例:JavaScript, Python, Scala, Rust, Kotlinなど)では、クロージャをサポートしています。

例(Python):

python
def make_counter(): count = 0 def counter(): nonlocal count count += 1 return count return counter c = make_counter() print(c()) # 1 print(c()) # 2

まとめ

特徴 説明
関数+スコープ クロージャは関数とその定義時のスコープのセット
自由変数をキャプチャ 外部の変数を保持し続ける
状態の保持 関数が呼ばれた後も変数を保持可能
関数型での活用が広範囲 状態管理、カリー化、部分適用などに活用される

必要であれば、他の言語での具体例や、クロージャの応用的な使用方法についても説明できます。

生成日:2025/06/01