次はJavaScriptでのクロージャについてです。間違えやすいケースについて書いてみます。ボタンが3つある1番目のボタンをクリックしたら1をアラートで表示2番目のボタンをクリックしたら2をアラートで表示3番目のボタンをクリックしたら3をアラートで表示これをコードにしてみましょう。value="3"></form></body>次にScriptタグの中身を書いて見ましょう。button3Click;}これは取り合えず非常に冗長ですが、オーソドックスな書き方です。これをクロージャで書いてみましょう。function(){alert(3);};};少しシンプルになりました。色々なライブラリとのコンフリクションがあったりするので、最近のJavaScriptの主流の書き方では、極力グローバルの変数や関数を使いません。これでもまだ冗長なので、普通に以下のようなコードを書かれると思います。function(){alert(i);};}};これを実行すると分かると思いますが、どのボタンをクリックしても4が表示されます。ループの中のクロージャはループカウンタの変数iに対する参照を持ちますが、最後に評価された結果の4が全てのクロージャから参照されてしまうのです。上記コードに手を入れて正しく動くようにしてみます。function(){alert(n);};//iを渡す})(i);}};匿名関数にiを都度渡していますが、これによってiを参照しなくなります。関数に渡された仮引数を都度参照するので、この場合正しく動きます。最後に効率化を行いましょう。関数リテラルはキャッシュされず、インタプリタによってそのステートメントが評価されるたびに新しい関数オブジェクトが作られます。"(function(n){"で始まる関数のオブジェクトは都度つくられるのです。button);}};関数は都度作られるというのは、以下のコードで確認できます。list[2]);上記は全てfalseになります。かずくんBehavior.js使って、HTMLからjavascriptコードを消し去るときに、closureを使いました。前提として、bodyタグにonload="windowOnload()"が記述済みとするの部分すら、HTMLから除去して、jsファイルで定義できる優れもの。関数は都度作られる同じ関数リテラルを複数回評価した場合、特定の条件を満たせば同じ関数オブジェクトを再利用することが仕様上認められていたと思います。処理系によっては「上記は全てfalseにな」らない可能性があると思います。のり>まじかんとさんそういう処理系もあるんですね。falseになるという記述はまずいですね。masaクロージャと無名関数を勘違いしてませんか?(function(n){を含むコードでbuttonが関数外部で宣言されているため偶然にもクロージャ(に近いもの?)ができていますが、本記事で紹介されている「クロージャ」なるものはただの関数内で宣言された無名関数です。使い方」でggったらこのページが一番上に表示されてしまって正直これはまずいと思ったのでコメントさせていただきます。http://dqn.sakusakutto.jp/2009/01/javascript_5.htmlこちらの記事がわかりやすいと思いますので参照してみてください。様の言うとおり、このページが上に表示されているにもかかわらず、内容は首をひねるものでした。クロージャを理解しようとしている人が見て勘違いされては困ると思い、私もコメントさせていただきます。