看来我并不像我想象的那样理解 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 示例不起作用,或许可以比较两个示例中发生的情况?