2011-01-23 14 views
5

このようにコールバックの配列を設定すると、すべてのコールバックのダイアログウィンドウで20が得られます。代わりに配列のインデックスを取得したいと思います。これは可能ですか?コールバックを呼び出す関数は、コールバックが1つのパラメータを持つことを期待しています。私は外部ライブラリの一部であるため、コールバックの呼び出し元を制御しません。どんな助けもありがとうございます。コールバックの配列を設定し、コールバックの値として配列インデックスを使用しようとしました

for (var i = 0; i < 20; i++) { 
    callbackDB[i] = function(data) { 
    alert(i); 
    } 
} 

答えて

11

関数が呼び出されたときiが評価されているので、あなたはスコープにあなたが期待値を保持するために、新たな機能の実行中iの値が必要になります。

 // returns a function that closes around the `current_i` formal parameter. 
var createFunction = function(current_i) { 
    return function(data) { 
     alert(current_i); 
    }; 
}; 

    // In each iteration, call "createFunction", passing the current value of "i" 
    // A function is returned that references the "i" value you passed in. 
for (var i = 0; i < 20; i++) { 
    callbackDB[i] = createFunction(i); 
} 
+0

私はcreateFunctionため、VARの代わりにキーワード機能を使用していた(それは、「コールバック」と呼ばれていた例では)関数にコールする必要がありますそれ以外の点では魅力的でした。ありがとうございました! – Xavier

+0

@Xavier:それは私にちょうどうんざりでした。私は 'var createFunction = function(current_i){...'を実行するつもりでした。 'function createFunction(...')として宣言を行うことも良いです。 – user113716

2

オブジェクトを使用する別のソリューションです。この場合

var callbackDB = new Array(); 
 

 
for (var i = 0; i < 20; i++) { 
 
    callbackDB[i] = { 
 
    value: i, 
 
    callback: function() { 
 
     alert(this.value); 
 
    } 
 
    }; 
 
} 
 
\t \t \t 
 
callbackDB[5].callback();

関連する問題