Кажется, я не так хорошо понимаю обратные вызовы JavaScript, как я думал.
В следующем примере я думаю, что каждая копия функции в setTimeout будет ссылаться на свою собственную копию переменной "index". Поэтому при выполнении примера должны появиться следующие предупреждения: «ноль», «один», «два».
var array = ["zero", "one", "two"];
var out = "";
for(var i = 0; i < 3; i++){
var index = i;
setTimeout( function(){alert(array[index])}, 1 );
}
Однако, похоже, что существует только одна копия индексной переменной, и все копии функции обратного вызова указывают на одну и ту же переменную, давая мне следующие предупреждения: «два», «два» «два».
Следующий аналогичный (я думал) пример в java печатает «ноль», «один», «два», как и ожидалось.
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 не работает, и, возможно, сравнить, что происходит в двух примерах?