【Coffee】forループでやらかしてしまった
まさかやらかすとは思ってなかった
某QiitaWidgetをasyncなajax(XMLHttpRequest)使って書いたわけだけどやはりテストが足りてなかった。
誰もが一度は通る道
forループはJSではスコープされてくれない、このことは有名だよね。実際自分も頭の片隅にそれは入れていた…
でも忘れてた
とりあえずスコープしてやるまともな方法ってなんだろう…
http://qa.atmarkit.co.jp/q/3410
やっぱ即時関数で囲っておけばいいか
とりあえず修正ね。
こんな感じにdoで囲ってやった。
要するにこういうこと。
arg = ["foo","bar","baz"]
for i in arg
  setTimeout ->
    console.log i
  ,200
for i in arg
  do (i) ->
    n=i
    setTimeout ->
      console.log n
    ,200
結果は
baz
baz
baz
foo
bar
baz
doブロックの使い方として合ってるのかな…
ちなみにコンパイル後のjsはこうなってる。
var arg, i, _fn, _i, _j, _len, _len1;
arg = ["foo", "bar", "baz"];
for (_i = 0, _len = arg.length; _i < _len; _i++) {
  i = arg[_i];
  setTimeout(function() {
    return console.log(i);
  }, 200);
}
_fn = function(i) {
  var n;
  n = i;
  return setTimeout(function() {
    return console.log(n);
  }, 200);
};
for (_j = 0, _len1 = arg.length; _j < _len1; _j++) {
  i = arg[_j];
  _fn(i);
}
あっ、これi渡してる意味ないな…
とか考えてたらこんなこともできる。
for i in arg
  do (n=i) ->
    setTimeout ->
      console.log n
    ,200
do ($ = jQuery) ->
  $ ->
    ...
みたいなのだろうか…回りくどいけど。WPとかで使うやつ。(function($){})(jQuery)の方が手っ取り早いとか置いておいて。(っていうかコンパイルするとそうなるんだけど)
結論
今回採用したコードは少し無駄があった()
お詫び
作った時なぜか気付かなかったけど2年前に既に@suinさんがqiita-widget作っておられたようです。こっちのほうが出来上がってるよね。(よくみたらinnerText問題に遭遇してるw)