Javascript 如何编写一个JS回调函数来记住一个变化变量的旧值?

Javascript 如何编写一个JS回调函数来记住一个变化变量的旧值?,javascript,asynchronous,closures,Javascript,Asynchronous,Closures,下面是我的JS程序的简化。mylist是一个字符串数组,MyAsync是一个函数,它接受一个对象并安排稍后调用提供的回调 for (var myindex = 0; myindex < mylist.length; myindex += 1) { MyAsync(mylist[myindex], function () { alert(myindex); }); } 当mylist中有10项时,结果是两条警报消息,每条消息显示10项。很明显,循环结束后,它会使用myi

下面是我的JS程序的简化。mylist是一个字符串数组,MyAsync是一个函数,它接受一个对象并安排稍后调用提供的回调

for (var myindex = 0; myindex < mylist.length; myindex += 1) {      
    MyAsync(mylist[myindex], function () { alert(myindex); });
}
当mylist中有10项时,结果是两条警报消息,每条消息显示10项。很明显,循环结束后,它会使用myindex的值。所以我做了一个小小的改变

for (var myindex = 0; myindex < mylist.length; myindex += 1) {
    var copyindex = myindex;
    MyAsync(mylist[myindex], function () { alert(copyindex); });
}
现在,每个警报显示9

我如何安排回调函数知道调用MyAsync时myindex是什么

不同步地,billpg。

是的,因为评论和你所经历的原因

我们可以改用递归函数:

 var len = mylist.length;

 function asyncLoop(index) {
    MyAsync(mylist[index], function () { 
    if(index < len) {
        asyncLoop(++index);
     }
    });
  } 
  asyncLoop(0);
作为注释,-同时将它们全部触发**-循环可以运行得很快。并跟踪数组计数


您可以使用闭包来实现这一点:下面是一些代码,我认为它们演示了您想要的内容,打印出0。。九,

var funcs = [];

for(var i = 0; i < 10; i++){
    funcs.push( (function(j){
        return function(){
            console.log(j);
        };
    })(i));
}

funcs.forEach(function(f){
    f();
});
其思想是,在返回要添加到列表中的函数时,当从参数到外部函数构造该函数时,会捕获i的值


这里有一篇SO帖子帮助我做到了这一点:

这会不会延迟后续的每个MyAsync调用,直到前一个调用完成?是的,会的。你不希望这样吗?我想你是这样做的,因为你想跟踪索引?我想所有的MyAsync调用都同时被触发,但是当每一个调用完成时,回调就知道是哪一个。知道哪一个,-就像在数组中的位置一样?-威尔:这很有趣,非常感谢。为什么你的版本可以工作,而我的版本使用的是索引副本却不行?据我所知,唯一的区别是您使用的是命名函数,而不是我的匿名函数包装警报调用。您可以使用闭包来完成此操作。不,您不能。闭包是导致此问题的原因。OP在循环中创建的函数已经是闭包。解决方案是通过执行一个函数来创建一个新的作用域。该函数是否为闭包无关紧要。术语事项;
var funcs = [];

for(var i = 0; i < 10; i++){
    funcs.push( (function(j){
        return function(){
            console.log(j);
        };
    })(i));
}

funcs.forEach(function(f){
    f();
});