1

私は次のものを持っています:

for( var i=0; i<array.length; i++) {
   if(array[i] instanceof Buff) {
   someDiv[i].onclick = buffTest.bind(i);
   }
}

私は本当に次のようなことをしたくなりますsomeDiv[i].onclick = function() { buffTest(i) };が、実際に何が間違っているのかを学び、改善するために、自分が間違っていることを理解したいと思います。何らかの方法でバインドを間違って使用していますか? 言及するのを忘れていましたが、私が抱えている問題は次のとおりです。

function buffTest(yy){
console.log(yy);
}

console.log は、i の数値の代わりに MouseEvent を返します。この問題に関するヘルプは大歓迎です。事前に情報を提供していただきありがとうございます。

4

3 に答える 3

4

おそらく、の最初の引数がbindthisであるためです。

おそらく代わりにこれが必要です:

someDiv[i].onclick = buffTest.bind(someDiv[i], i);

編集: @bfavarette が述べたように、リスナーに何が含まれるか気にしない場合は、の代わりにthis渡すこともできますが、このメソッドを使用してイベントリスナーをアタッチする場合、リスナーがアタッチされたオブジェクトであることが期待されるため、私は私が提供したサンプルでは、​​その動作に固執しました。nullsomeDiv[i]this

于 2013-09-10T01:16:53.840 に答える
2

bind後で呼び出されるときに関数の値を設定し、this関数の引数を事前に入力します。値を設定するだけの場合はthis、最初の引数として渡します。最初の引数以降の引数は、関数パラメーターを「事前入力」するために使用されます。

あなたの場合、パラメーターを事前に入力したいだけなので、最初のパラメーターをbindtonullまたはwindow何か他のものに設定します。i2 番目のパラメーターにする必要があります。

buffTest.bind(
  null, // doesn't matter
  i     // pre-fills the first argument to buffTest
)
于 2013-09-10T01:20:54.013 に答える
0

これを試して。

function makeTest(i) {
    return function () {
        buffTest(i);
    };
}

for (var i = 0; i < array.length; i++) {
    if (array[i] instanceof Buff) {
        someDiv[i].onclick = makeTest(i);
    }
}
于 2013-09-10T01:18:16.830 に答える