我正在寻找一些简单直接的东西,我在堆栈中提取的大部分内容并不是我所需要的。我有一个数组,我想在每次迭代后调用一个函数时循环。那会是什么样子?
问问题
2330 次
3 回答
5
我假设您遇到问题是因为 Javascript 处理闭包的方式。Douglas Crockford在他的书中谈到了这一点,他使用了一个函数示例,该函数将点击事件处理程序分配给节点数组。“直观”的方式是:
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);
}
}
另外,这使您可以避免在每次迭代时创建函数。
于 2013-06-09T01:16:55.800 回答
4
var arr = [1,2,3];
for(var i = 0; i < arr.length; i++){
someFunction();
}
于 2013-06-09T00:50:38.787 回答
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());
于 2013-06-09T01:24:23.023 回答