Search on the blog

2011年6月10日金曜日

クロージャの使用例

 今日は、クロージャの使用例を書きます。昔クロージャについて書きましたが、いまいち実際どういう場面で使われるのかイメージできてませんでした。

 今回は、クロージャを使うと上手くかける例を紹介します。まず、以下のソースをみてください。(※playしてstopすると、ソースが読めます。)

クロージャの説明サンプル1 - jsdo.it - share JavaScript, HTML5 and CSS


 3つの英文があって、それを日本語訳します。上記の例では、文章が3つでしたが、文章が100個とかになるとループで書きたくなります。ループで書いてみましょう。
 あれ、和訳されません。何故でしょう?
alertでデバッグすると分かりますが、カウンタが3になっています。つまり、resultが返ってきたときには、すでにループを抜けて変数iは3になってるのです。

 それでは、こういうふうに書くとどうでしょうか?ループカウンタとは別にカウンタを定義して、resultを受け取った段階でインクリメントします。

クロージャの説明サンプル3 - jsdo.it - share JavaScript, HTML5 and CSS


 今度は和訳されましたが、文章の順番がおかしいです。(タイミングによっては、正常な順番で表示されるようです。)
これは、非同期処理がもたらす副作用。コールした順番にレスポンスが返ってきていないのです。

 んー困った。非同期に処理をしたいけど、ある部分では同期をとりたい。API関数を呼び出した時点でのカウンタの値のままのものを、resultが返ってきたあとも参照したい。

 ん、これは、どこかで聞いたことがある。と思ってひらめきました。
”引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。”

 これって、まさにクロージャじゃないか!!
ということで、書いてみる。
 なるほど、そういう意味だったのか。と納得。いろんなクロージャの例をみましたが、たぶんこれが一番分かりやすいです。

0 件のコメント:

コメントを投稿