示例需要在javascript中for循环内部的回调函数

时间:2013-06-09 00:48:29

标签: javascript arrays for-loop callback

我正在寻找一些简单而直接的东西,我在堆栈上提取的大部分内容都不是我需要的。我有一个数组,我希望在每次迭代后调用函数时循环。那会是什么样的?

3 个答案:

答案 0 :(得分:5)

我假设你遇到问题,因为在Javascript中处理闭包的方式。 Douglas Crockford通过使用将click事件处理程序分配给节点数组的函数示例,在他的book中讨论了这一点。 “直观”的方式是:

var addHandlers=function(nodes){
    var i;
    for(i=0; i<nodes.length;++i){
        nodes[i].onClick= function {
            alert (i);
        };
    }
};

但是,这是不正确的:每个onClick回调都会显示相同的i = nodes.length-1值。这是因为i的值未复制,而是在每个内部函数中引用。更好的方法是创建一个返回回调的辅助函数,类似于以下内容:

var addHandlers = function (nodes) {
    var helper = function (i){
        return function (e){
            alert (i);
        }
    }
    for (int i =0; i<nodes.length();i++){
        nodes [i].onClick=helper (i);
    }
}

另外,这可以避免在每次迭代时创建一个函数。

答案 1 :(得分:4)

var arr = [1,2,3];
for(var i = 0; i < arr.length; i++){
  someFunction();
} 

答案 2 :(得分:1)

如果要处理要在异步函数中使用的数组的一个元素,然后处理下一个下一个元素,则可以执行以下操作;

function asynchCallback(arrayToProcess,someVar){
  console.log("callback called with parameter:",someVar);
  processArray(arrayToProcess);
}

function processArray(arr){
  if(arr.length===0){
    console.log("done");
    return;
  }
  var someVar=tmp.splice(0,1);
  setTimeout(function(){
    asynchCallback(tmp,someVar[0]);
  },100);
}
//send a copy of the array:
processArray([1,2,3].concat());