問題です。
問題: 呼び出すたびに、1,2,3,...を返すような関数 f( )を定義せよ。f(); // 1
f(); // 2
f(); // 3
この問題、解けますでしょうか?
普通の関数では、できないと思います。
しかし「クロージャ」というのを使えば、このようなことができます。
クロージャって何だ?
「クロージャ」という言葉を、プログラムの本やサイトで目にすることがありますよね。私が最初に見たのは続・初めてのPerl 改訂版(アルパカ本)でした。
まったく理解できませんでした。
その後、404 Blog not foundやnaoyaさんのブログなどで「クロージャ」という単語を目にしました。
やはり、まったく分かりませんでした。
とどめの一撃はWikipediaの解説記事。
クロージャ (クロージャー、Closure) は、プログラミング言語において引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決する関数のことである。
本当にありがとうございました(涙)
私はあきらめました。
そして歳月は流れ・・・
最近、Javascriptで勉強してみたら、突然理解できるようになりました。
理解した、というよりも「クロージャが作れてしまった」のです。
上に書いた問題が解けてしまったのです。
「よくわかんねーけど、おれ、自転車に乗れてるぞ?」という、少年のような気持ちでした。
そこで、
「クロージャ」がまったく意味不明だった私がクロージャを作れるようになった過程
を、ここに披露いたします。(注)
私がクロージャを理解するために格闘して、わかったことは、
クロージャは理解するより作るほうが簡単。
クロージャを作るためには、次の3つのことだけできればよい。
ということでした。クロージャを作成するために必要な3つのこと
- 関数内の関数
- 関数を返す関数
- 無名関数
クロージャを作ってからクロージャを理解する。
理解するよりも、作る方が簡単。
これがポイントです。
次の記事 猿でもわかるクロージャ超入門 2 関数の中の関数
まとめ記事 [JavaScript] 猿でもわかるクロージャ超入門 まとめ
注1:理解できるようにはなったが、活用できてない自分がいるのは内緒です。

コメントする