【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)

コメントを残す

%d人のブロガーが「いいね」をつけました。