クロージャではまったのでメモ
クロージャではまるのは C# に続き CoffeeScript で2度目なのでメモ。
やりたかったこと
4つのクロージャに0、1、2、3のそれぞれを束縛したかった。
間違い
f() for f in ((-> console.log i) for i in [0...4]) # 4 # 4 # 4 # 4
CoffeeScript の性質上仕方のないことで変数のスコープが大変わかりづらいが、すべてのクロージャが同じ変数を束縛している。そのため同じ数が束縛されてしまった。
正解
f() for f in ((do (i) -> -> console.log i) for i in [0...4]) # 0 # 1 # 2 # 3
クロージャを作るときに即時関数を使って変数を新たに宣言し、その変数を束縛している。うまくいった。
まとめ
- クロージャは変数のスコープに注意
- ループでクロージャを作るときは要注意
- CoffeeScript でクロージャを作るときも要注意