最近、関数の配列を作成する必要があることに気付きました。関数は XML ドキュメントの値を使用し、for ループを使用して適切なノードを実行しています。しかし、これを行ったところ、XML シートの最後のノード (for ループの最後の実行に対応する) だけが、配列内のすべての関数によって使用されていることがわかりました。
以下は、これを示す例です。
var numArr = [];
var funArr = [];
for(var i = 0; i < 10; ++i){
numArr[numArr.length] = i;
funArr[funArr.length] = function(){ return i; };
}
window.alert("Num: " + numArr[5] + "\nFun: " + funArr[5]());
出力は Num: 5 および Fun: 10 です。
調査の結果、機能するコードのセグメントを見つけましたが、なぜそれが機能するのかを正確に理解するのに苦労しています。ここで例を使用して再現しました。
var funArr2 = [];
for(var i = 0; i < 10; ++i)
funArr2[funArr2.length] = (function(i){ return function(){ return i;}})(i);
window.alert("Fun 2: " + funArr2[5]());
スコーピングに関係していることはわかっていますが、一見したところ、私の単純なアプローチとは異なる動作をするようには見えません。私は Javascript の初心者なので、この関数を関数に返す手法を使用すると、スコープの問題が回避されるのはなぜですか? また、最後に (i) が含まれるのはなぜですか?
事前にどうもありがとうございました。