今回は、クロージャを使うと上手くかける例を紹介します。まず、以下のソースをみてください。(※playしてstopすると、ソースが読めます。)
クロージャの説明サンプル1 - jsdo.it - share JavaScript, HTML5 and CSS
あれ、和訳されません。何故でしょう?
alertでデバッグすると分かりますが、カウンタが3になっています。つまり、resultが返ってきたときには、すでにループを抜けて変数iは3になってるのです。
それでは、こういうふうに書くとどうでしょうか?ループカウンタとは別にカウンタを定義して、resultを受け取った段階でインクリメントします。
クロージャの説明サンプル3 - jsdo.it - share JavaScript, HTML5 and CSS
これは、非同期処理がもたらす副作用。コールした順番にレスポンスが返ってきていないのです。
んー困った。非同期に処理をしたいけど、ある部分では同期をとりたい。API関数を呼び出した時点でのカウンタの値のままのものを、resultが返ってきたあとも参照したい。
ん、これは、どこかで聞いたことがある。と思ってひらめきました。
”引数以外の変数を実行時の環境ではなく、自身が定義された環境(静的スコープ)において解決することを特徴とする。”
これって、まさにクロージャじゃないか!!
ということで、書いてみる。
なるほど、そういう意味だったのか。と納得。いろんなクロージャの例をみましたが、たぶんこれが一番分かりやすいです。
0 件のコメント:
コメントを投稿