Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。3:19言語によって定義が違うことを想定していませんでした。一般化された定義が知りたいです。19:164一番的確な回答は英語版のこれです。ある関数に自由変数がある時、それを全て束縛して閉じた世界を作るものがクロージャー(閉じるもの、閉じた箱)ということです。これを知ると、例えば無名関数そのものはクロージャーではないけれど、細かいところはすっ飛ばしてそれを同じクロージャーと呼んでいることも理解できます。Qiitaのこの記事も自由変数と束縛変数に言及があり、根源に近いところから議論されていて良い記事と思います。20:58なるほど、これはわかりやすい説明ですね。ありがとうございます。22:342語源的には、数学で、ある式が有限回で評価できるとき閉じていると呼ぶらしいです。コンピューターの世界では派生した概念や特定の設計にも同じ用語が使われていますから、それが混乱の原因なのでしょう。票1意見がわかれそうな内容ではありますと前置きをしておきます。私の認識は、クロージャは仕組みそのものであって、無名関数とは分けて考えたほうがよいと思っています。関数名を指定せずに関数を作成できるようにするものです。している例も(言語も)見かけます。ここで、PHPの無名関数について、もっとよく見てみると外の変数を参照するには以下のことをしろと書いています。クロージャは、変数を親のスコープから引き継ぐことができます。渡さなければなりません。JavaScriptでは何も意識しないでも外部の変数を参照できたのに対し、PHPではuseによって明示的に指定する必要があるのです。PHPでは外部の値を参照する(この外部の値を参照できるのが、私の考えるクロージャの部分です)ためにはわざわざ別のuseという予約語を用意していることからも、無名関数とクロージャは別として考えたほうがわかりやすいというのが私の見解です。|1言語仕様においては用語としてclosureが定義されているわけではありませんので、世界中の人が同意する「正しい」答えはありません。この言語仕様には各所でclosureの単語が出現します。この事実を採用するならば、言語仕様に書いてあるclosureとは関数functionのシノニムです。こちらのほうがたしかに精密に言及している気がします。ご指摘の件はどうかというと、私は文脈によって使い分けてもいいのではないかと思います。私自身は言語仕様的な用法、つまりfunction===closureで使っています(笑)。「関数の種類の一つとしてクロージャという名前が使われてる」のは微妙ですね。booleanみたいなのが作れない)のがその根拠です。さんが挙げている例で十分そうではありますが、回答投稿としてまとめることに意味はあると思うので、投稿しています。クロージャーとは、プログラミング言語を実装する際に必要になるデータ構造、が私の中での第一定義だと思います。何かというと、例えば関数実行を行っている場合には、その実行環境は、おそらく以下のようなデータ構造を保持しています。マップラムダ関数の問題は何かというと、それがリターンした際に、スタックは解法されるので、そこだけで保持していた変数情報は失われてしまいます。これを手っ取り早く解決しようとすると、何が起こるかというと、ラムダっぽい関数に対して、その変数のバインドはグローバル変数マップのものを利用する、だったりします。バインディングと呼ばれ、古い言語だとこういう挙動があったりします。Lispしかしそれだと、こう、意図しない挙動に悩まされたりします。大量のラムダを利用する関数型っぽいロジックを書く場合。その値のマップを定義して、それをラムダ関数オブジェクトの内部に入れこむことです。これが、クロージャーです。関数的なオブジェクトの一つがクロージャと呼ばれるのはあまり違和感はない同じく、言語機能の文脈で上記処理を行うことを、例えば「クロージャ処理」とか言われても、これもまたあまり違和感がないです。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。