我有以下代码:
for(var i = 0; i < list.length; i++){
mc_cli.get(list[i], function(err, response) {
do_something(i);
});
}
mc_cli
是连接到一个 memcached 数据库的对象。由于回调函数是异步执行的,因此当 for 循环已经结束时可能会被执行。此外,以这种方式调用 do_something(i)
时,它总是使用 for 循环的最后一个值。
我尝试使用以下方式进行闭包处理
do_something((function(x){return x})(i))
但显然这又是在始终使用for循环索引的最后一个值。
我还尝试在for循环之前声明一个函数,如下所示:
var create_closure = function(i) {
return function() {
return i;
}
}
然后调用
do_something(create_closure(i)())
但是一次又一次地尝试仍然没有成功,返回值始终是for循环的最后一个值。
有人能告诉我我在闭包方面做错了什么吗?我以为我理解了它们,但我想不出为什么这不起作用。