私はこのようなコードを使用して、イベントハンドラ関数に引数を渡します。しかし、この特定のケースでは、ループが問題を引き起こしています。すべてのactiveVisual呼び出しで最後のlinkTags [i]だけがアクセス可能です。これは、引数を渡す無名関数がループ全体に対して同じであるという事実と関係しています。addEventListenerに "新しい"匿名関数を渡すことができます
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
function(evt) {
activeVisual(evt, linkTags[i]);
});
}
は今、私はこのような無名関数宣言の前に新しいを追加しようと覚えている:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new function(evt) {
activeVisual(evt, linkTags[i]);
});
}
それは動作しませんでした。 activeVisualは決して呼び出されません。なぜ誰かに私に説明することができますか、どうすればそれを動作させることができますか?
UPDATE FINAL SOLUTION
私WORKINGコードの下にあるすべての回答のおかげで次のようになります。
// Function that provides pass of event handling parameters with separate copy in each loop
function callbackHandler(index) {
return function(evt) {
activeVisual(evt, linkTags[index]);
}
}
...
for (var i = 0; i < linkTags.length; i++) {
...
addCrossEvent(linkTags[i], "mousedown", callbackHandler(i));
}
。 ?それは匿名の関数にのみ言い渡されていますか? –
addCrossEvent(linkTags [i]、 "click"、launchLink)を実行すると、あなたは各ループのlinkTags配列に値iを持っていますが、関数がイベントで呼び出されると、最後の値があり、配列内の同じ位置になります。 – madeinstefano
@ avok00: 'addCrossEvent(linkTags [i ]、 "click"、launchLink) '' linkTags [i] 'の値を直接関数に渡します。しかし、* callback *内の 'activeVisual(evt、linkTags [i]);'は、コールバックが呼び出されたときに評価されます。しかし、コールバックが呼び出されると、ループは既に終了しており、 'i'はその最終値を持っています。 –