思ったほどJavaScriptのコールバックが理解できていないようです。
次の例では、setTimeout 内の関数の各コピーが変数「index」の独自のコピーを参照すると考えられます。したがって、この例を実行すると、「zero」「one」「two」というアラートが生成されます。
var array = ["zero", "one", "two"];
var out = "";
for(var i = 0; i < 3; i++){
var index = i;
setTimeout( function(){alert(array[index])}, 1 );
}
ただし、インデックス変数のコピーは 1 つしかないようで、コールバック関数のすべてのコピーが同じ変数を指しているため、「2 つ」「2 つ」「2 つ」というアラートが表示されます。
次の類似した (私が考えた) Java の例は、予想どおり、「ゼロ」「1」「2」を出力します。
import java.util.ArrayList;
import java.util.List;
public class CallBacks {
public static void main(String[] args) {
String[] array = {"zero", "one", "two"};
List<Callback> callBacks = new ArrayList<Callback>();
for(int i = 0; i<3; i++){
final String print = array[i];
callBacks.add(
new Callback(){
public void execute(){
System.out.println(print);
}
}
);
}
for(Callback cb : callBacks){
cb.execute();
}
}
private interface Callback{
public void execute();
}
}
js の例が機能しない理由を説明して、2 つの例で何が起こっているかを比較できますか?