2011-05-05 52 views
1

我有以下情况:如何在请求调用时将值传递给回调函数?

var foo = [ 0, 1, 2 ] 
for (var i in foo) { 
    Asyncstuff.get(URI).on('response', function(res) { console.log(i); } }); 
} 

因为。对(“回应”,...)被调用以异步方式,输出将最有可能

2 
2 
2 

有在.get()被调用到回调函数时可能会传递值i

回答

7

您需要关闭。还有比这更好的方法,但应清楚地说明这个概念:

var foo = [ 0, 1, 2 ] 
for (var i in foo) { 
    (function(i){ 
     Asyncstuff.get(URI).on('response', function(res) { console.log(i); } }); 
    })(i); 
} 
1

正如cwolves提到你需要使用闭包包裹。原因是JavaScript和其他语言(例如:C#)封闭捕获“变量”而不是“值”,因此在代码中,变量“i”被内部函数捕获,并且当该函数执行时,它使用捕获的变量“i”显然会在循环结束时成为循环中的最后一个值。在使用JavaScript等捕获变量的语言中使用闭包时,您需要小心。

在cwolves解决方案中,函数中的“i”成为一个新变量,与for循环中的I不同,因此它工作正常。

相关问题