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