クロージャ【closure】関数閉包
概要

通常、関数からアクセスできる変数は、自身の引数、内部で宣言したローカル変数、グローバル変数に限られる。関数の実行が終了すると、内部のローカル変数はメモリから消滅するのが一般的である。
クロージャが有効な場合、外側の関数の内部でさらに別の関数を定義すると、内側の関数が外側のローカル変数への参照を保持し続ける。外側の関数の実行が終了した後でも、内側の関数を通じてその変数にアクセスし、値を読み書きすることができる。これを「変数の束縛」という。
この性質を利用すると、グローバル変数を使わずに関数単位で状態を保持したり、同じ処理に対して設定の異なるバリエーションを複数生成したりすることができる。オブジェクト指向言語におけるインスタンス変数のカプセル化に似た効果を、関数だけで簡潔に実現できる。
関数を引数として受け取る高階関数に渡すコールバック関数もクロージャの一種である。定義された時点の変数環境ごと受け渡せるため、単純な関数よりも柔軟な処理が記述できる。非同期処理やイベント処理とも組み合わせて用いられる。実際に呼び出されるまで実行を遅らせる「遅延評価」にも対応しており、関数型プログラミングでは制御構造の定義にも応用される。
クロージャは関数型言語では中心的な機能の一つとされるが、近年では関数型言語の仕様や考え方を取り入れて関数を第一級オブジェクトとして扱う仕組みが導入された手続き型やオブジェクト指向型の言語でも標準的に利用できるようになっている。対応言語としてはLispやHaskell、Scalaのような関数型言語のほか、JavaScript、Python、Ruby、Swift、Kotlin、Go言語、Rustなどがある。
(2026.6.25更新)