読者です 読者をやめる 読者になる 読者になる

setTimeoutの中のthis

コメント付き動画サービス(仮)を作ってるんですが、内容的にViewをいじる作業が多く、結果としてCoffeeScriptばっか書いてます。
そしたら、setTimeoutの中でthisが思った通りのオブジェクトを指してなくてうまく動かない事案が発生。しばらくハマりました。

$('#comments p').map ->
  setTimeout ->
    commentMove $(this)
  , 1000

みたいな感じで、commentsブロック内の各コメントをjqueryオブジェクトとして取得してそれを一斉に動かすコードを書いたんですが、上記のコードでは上手く動かず。

$('#comments p').map ->
  comment = $(this)
  setTimeout ->
    commentMove comment
  , 1000

みたいに、一回ローカル変数commentを作ってやると上手くいきました。
結論としては、冒頭で述べたように、setTimeoutの中ではthisの参照先が変わっちゃうのが原因っぽいです。
分かってみたら簡単な話なんだけども。。。。