Javascript 如何在请求调用时将值传递给回调函数?

Javascript 如何在请求调用时将值传递给回调函数?,javascript,node.js,Javascript,Node.js,我有以下情况: var foo = [ 0, 1, 2 ] for (var i in foo) { Asyncstuff.get(URI).on('response', function(res) { console.log(i); } }); } 因为.on('response',…)是以异步方式调用的,所以输出很可能是 2 2 2 是否有可能在调用.get()回调函数时传递i的值?您需要一个闭包。有比这更好的方法,但这应该清楚地表明这一概念: var foo = [ 0, 1,

我有以下情况:

var foo = [ 0, 1, 2 ]
for (var i in foo) {
    Asyncstuff.get(URI).on('response', function(res) { console.log(i); } });
}
因为.on('response',…)是以异步方式调用的,所以输出很可能是

2
2
2

是否有可能在调用.get()回调函数时传递i的值?

您需要一个闭包。有比这更好的方法,但这应该清楚地表明这一概念:

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

你需要结束。有比这更好的方法,但这应该清楚地表明这一概念:

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

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


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

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

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

请参考我的答案,我相信你可以用这个来解决你的问题,因为你可以控制for循环

请参考我的答案,我相信你可以用这个来解决你的问题,因为你已经控制了for循环