レキシカルクロージャについて今日もやらかしてしまったのでよくある失敗への対処を書く

今日やらかしたミス。

下記のソースを見て欲しい。3つ目が本日もやらかしたミス。

ループの中で(レキシカル)クロージャを生成してHTML要素のイベントにバインドする、などよくあるシチュエーションだと思うが、そういう場合にクロージャ内でループ変数を参照すると痛い目にあう。

クロージャから見えるループ変数はその時の値ではなく、あくまでループに使われた変数としての値を持っているので、ループ内でせっせと作ったクロージャを実行する頃には、ループを走り終わった出汁ガラのような骸がループ変数に束縛されている。

これを防ぐ方法はいくつかあるが、一番安易なのはレキシカルクロージャを二段構えにして、内部でループ変数から値をコピーするやり方(4番目)。

まあ、CoffeeScriptJavaScript)にかぎらず、レキシカルな言語だとよくあることですね。

教訓としては、ループ内のあとあと残る即時関数内でループ変数見てたら要注意ってことです。