gpt4 book ai didi

java和javascript回调比较

转载 作者:行者123 更新时间:2023-11-29 22:43:45 25 4
gpt4 key购买 nike

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

最佳答案

index 随循环的每次迭代而变化。您想要的是将 index 放入不受循环影响的闭包中:

var array = ["zero", "one", "two"];
var out = "";
for(var i = 0; i < 3; i++) {
(function(index) {
setTimeout( function(){alert(array[index])}, 1 );
})(i)
}

关于java和javascript回调比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/447097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com