【发布时间】:2010-10-01 14:50:03
【问题描述】:
看来我对 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 示例不起作用,或许可以比较两个示例中发生的情况?
【问题讨论】:
-
Prestaul,谢谢,这几乎是我同样的问题。我在发帖之前寻找了类似的问题,但没有找到这个。
-
我昨天问了 [一个几乎相同的][1] 问题,得到了几个不同的答案,并就每个问题的优点进行了一些讨论。可能值得一看 [1]:stackoverflow.com/questions/442985/…
标签: java javascript closures callback