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

时间:2014-04-03 17:51:12

标签: javascript asynchronous closures

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

for (var myindex = 0; myindex < mylist.length; myindex += 1) {      
    MyAsync(mylist[myindex], function () { alert(myindex); });
}

mylist 中有十个项目时,结果是两条警告信息,每条信息显示“10”。好的,它在循环结束后显然使用了 myindex 的值。所以我做了一点改变......

for (var myindex = 0; myindex < mylist.length; myindex += 1) {
    var copyindex = myindex;
    MyAsync(mylist[myindex], function () { alert(copyindex); });
}

现在,每个提醒显示“9”。

我如何安排回调函数,以便在调用 MyAsync 时知道 myindex 是什么?

异步,billpg。

2 个答案:

答案 0 :(得分:0)

是的,作为评论和not making functions in a loop因为您遇到的原因。

我们可以使用递归函数:

 var len = mylist.length;

 function asyncLoop(index) {
    MyAsync(mylist[index], function () { 
    if(index < len) {
        asyncLoop(++index);
     }
    });
  } 
  asyncLoop(0);

作为评论, - 同时将它们全部关闭*(* - 快速循环可以运行)。并跟踪数组计数 ...

 function asyncDo(index) {
    MyAsync(mylist[index], function () { 
      /* we have access to the array index here */
      console.log(index);
    });
  } 

  for ( var i=0, len=mylist.length; i<len; ++i) { asyncDo(i); }

答案 1 :(得分:0)

你可以使用闭包来做到这一点:这里有一些我认为你想要的代码,打印出0 .. 9。

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帖子帮我解决了这个问题:JavaScript closures vs. anonymous functions