これを実行すると、すべてのspanのonclickで "10" がalertされます。 これは、clickした時点での i がalertされてるってことで、 「まぁ、そんなもんかなぁ」と、やや納得。 本当は、それぞれ表示されている文字と同じ値をalertして欲しいんですけどね。
一旦どこかのオブジェクトに値をセットしておけば良かろうってことで var el = document.createElement("span"); el.__index = i; el.appendChild(document.createTextNode(i)) el.onclick = function(){ alert(this.__index); } としてやると、とりあえず問題なく期待に応えてくれました。 ただ、それぞれのelに余計なプロパティがセットされて、気持ち悪い…。
ということで、新しい変数を用意して、 var index = i; // i + "" とかにしても同様。 var el = document.createElement("span"); el.appendChild(document.createTextNode(index)) el.onclick = function(){ alert(index); } としてやると、今度はすべて "9" がalertされます。 loopの度に変数が生成されているはずなのに…!?
納得いかないですけど、結果からすると、 loop毎に違うスコープになっているのではなく、 var i = 0 とかと同様、for文全体で1つのスコープになってる感じですよね…。 var el も、forの中では上書きされてるのでしょうね。 appendChildしてるから、document上では生き残ってるけど。