2016-03-07 86 views
0

我在函数内部循环的变量:循环中的变量 - 如何修复它在我的情况?

function myHandler() { 
    for (var i = 0; i < items.length; i++) { 
    var currItem = items[i]; 

    myObj.doSomething(function(data) { 
     console.log("ok"); 
     console.log("My currItem id: " + currItem.id); // the last one of all in items 
    }, function(e) { 
     console.log("error"); 
     console.log("My currItem id: " + currItem.id); // the last one of all in items 
    }); 
} 

currItem.id每次中的console.log()是等于最后在项中的项的。明显。我试图解决这个问题:

function myHandler() { 
    for (var i = 0; i < items.length; i++) { 
    var currItem = items[i]; 
    var currItem = (function(i2) { 
     return items[i2]; 
    })(i); 

    myObj.doSomething(function(data) { 
     console.log("ok"); 
     console.log("My currItem id: " + currItem.id); // the last one of all in items 
    }, function(e) { 
     console.log("error"); 
     console.log("My currItem id: " + currItem.id); // the last one of all in items 
    }); 
} 

而且仍然没有成功。为什么以及如何解决它?

+0

@elclanrs,没有.. – Mario

+0

@Mario:错误的;这正是你的问题。通过调用一个函数来填充一个变量并不会改变捕获该变量的方式。 – SLaks

+0

是啊,看起来你没有正确地应用修复...更容易使用'forEach' – elclanrs

回答

1

使用封这样的:这是被送回会记住其所创建的环境

内部函数。

function myHandler() { 
    for (var i = 0; i < items.length; i++) { 
    var currItem = items[i]; 

    myObj.doSomething((function(currItem) { 
     return function(data) { 
     console.log("ok"); 
     console.log("My currItem id: " + currItem.id); 
     } 
    })(currItem), (function(currItem) { 
     return function(e) { 
     console.log("error"); 
     console.log("My currItem id: " + currItem.id); 
     } 
    })(currItem)); 
    } 
} 

或者:

使用[].forEach,因为每个迭代器回调都会有它自己的上下文,不会被下一次迭代被覆盖..

0

如果doSomething方法是异步,这意味着回调在for循环之后运行,那么currItem将永远是最后一个。

原因是闭包,回调函数有一个闭包,它包含所有需要的函数执行信息,包括对变量currItem的引用。

因为它是一个引用,所以当循环结束时,currItem的值是最后一项,然后才调用回调函数。

解决它的最简单方法是将for循环的内部调用移动到一个将接受变量currItem作为参数的函数。这样变量不会改变。

可以使用数组的forEach功能,像这样做:

items.forEach(function(currItem){ 
.... 
});