2

パラメータとしてコールバック関数を必要とする非同期関数を呼び出しています。

JavaScriptコードは次のとおりです。

for(i in array) 
{
    var item = array[i];
    functionToCall(item[i][1], 50, function(a, b)
    {
        alert(a + b);
    });
}

functionToCall 関数を編集できません。私がやりたいのは、このようなコールバック関数で「item」変数を使用することです。

for(i in array) 
{
    var item = array[i];
    functionToCall(item[i][1], 50, function(a, b, c)
    {
        alert(a + b + c);
    }, item);
}

しかし、このコードは正しく動作しません。配列の最後のアイテムを常に使用しているため、関数内で「アイテム」を使用することはできません。

では、どうすればそれを行うことができますか?

4

3 に答える 3

4

関数内で使用できますitemが、配列の最後の要素を毎回使用しないように「キャプチャ」する必要があります。

for(var i = 0, l = array.length; i < l; ++i) { // better than for .. in
    var item = array[i];
    (function(item, i){
      functionToCall(item[i][1], 50, function(a, b) // do you really re-index item with the same index?
      {
          alert(a + b);
      });
    })(item, i);
}
于 2011-08-26T19:00:42.603 に答える
0

for..in配列を反復するために使用するのは悪い考えです。代わりに使用する.forEach()と、多くの問題が解消されます。

array.forEach(function(item)
{ 
    functionToCall(item[1], 50, function(a, b) 
    { 
        alert(a + b + item[1]); 
    }); 
}

.forEach()古いブラウザーで使用するには、こちらを参照してください

于 2011-08-26T19:02:14.333 に答える
0

私はこのようなことを試してみます:

 function createExecutionCall(itemIndex, number, item)
 {
      return function() { functionToCall(itemIndex, number, function(a, b)
      {
           // Example, item should be contained within this closure then
           alert(a + b + item);
      });
 }

 for(i in array) 
 {
     var item = array[i];

     var call = createExecutionCall(item[i][1], 50, item);
     call();
  }
于 2011-08-26T19:02:32.497 に答える