次のコードがあります。
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 ループの最後の値になります。
クロージャーで何が間違っているのか誰か教えてもらえますか? 私はそれらを理解していると思っていましたが、なぜこれが機能していないのかわかりません。