「クロージャー」について

こんばんは、今日は友人と話していて「クロージャー」の話になったので、今日は記事にしようと思います。説明がそれなりに難しい言葉ではありますがw
この「クロージャー」という言葉、言葉の利便性や使用頻度があまり無いにもかかわらず、誤解を招きやすいというか、「言葉遊び」専用の用語になる場合があるので、この際 解説してしまおうという訳です。

↓すかさずwikipediaを読むとこんな記述が
「クロージャ(クロージャー、英: closure)、関数閉包はプログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している。引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。」

↓続いてこんな記述も
「まれに、関数ではなくとも、環境に紐付けられたデータ構造のことをクロージャと呼ぶ場合もある。」

なんかあやしいと思ったら所謂多義語だったんですね。
「環境に紐付けられたデータ構造のことをクロージャと呼ぶ」、これは聞いたことがあるフレーズですよね。
要領を得ない”クロージャー”の説明で一度は耳にした事があるような、、そんなフレーズです。
この表現をそのままに、javascriptのコードで説明されて、その場では納得しても特に困らない気もするけど、やっぱり自分が人に説明する段階では無理があるなぁ。。という経験をした方の割合は多いのではないでしょうか。

少なくとも僕自身の周辺では、「プログラミング言語における関数オブジェクトの一種。いくつかの言語ではラムダ式や無名関数で実現している」を旨としたプログラム構造を指していそうです。というか他には見当がつきませんので、こちらで間違いないでしょう。
確かに「引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する」、このままの意味ですが
色んな関数やスコープを用いて説明されますが、スッキリ聞けた試しはありません、

恐らくは一番近いと思われる表現も見つけました。
“言語により、そのような内側の関数内に出現する自由変数(内側の関数の仮引数でもなく、内側の関数自身のローカル変数でもない変数)の扱いは異なるが、自由変数が、その呼び出しにおけるエンクロージャのその名前の変数を、レキシカルに参照するのがクロージャであり、実行時に外部の関数が実行された際、クロージャが形成される。クロージャは内部の関数のコードとエンクロージャのスコープ内の必要なすべての変数への参照からなる。”
理解できますか?これが不思議とコードで表現されると理解できるんですけど、説明が難しいキーワードもあったものですね。

以上です、お疲れ様です。