看來我不明白JavaScript回調和我想的一樣。java和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中的以下analagous(我認爲)示例打印出「zero」「one」「two」,如預期的那樣。
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例子不起作用,也許比較兩個例子中發生了什麼?
你見過:http://stackoverflow.com/questions/442985/how-can-one-de-reference-javascript-variables-when-enclosing-an-outer-scope – Prestaul 2009-01-15 15:22:03
Prestaul,謝謝,這幾乎是我的同一個問題。我在發佈之前查找了類似的問題,但沒有找到這個問題。 – morgancodes 2009-01-15 15:50:46
昨天我問了一個幾乎相同的問題,並在答案中得到了幾個不同的變化,並且討論了每個問題的優點。可能是值得一試 [1]:http://stackoverflow.com/questions/442985/how-can-one-de-reference-javascript-variables-when-enclosing-an-outer-scope – meouw 2009-01-15 16:08:17