与.bind有问题

时间:2013-09-10 01:04:03

标签: javascript

我有以下内容:

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返回一个MouseEvent而不是i中的数字。任何有关此事的帮助都非常感谢,提前感谢任何信息。

3 个答案:

答案 0 :(得分:4)

这可能只是因为bind的第一个参数是this值。

你可能想要这个:

someDiv[i].onclick = buffTest.bind(someDiv[i], i);
编辑:就像@bfavarette所说,如果你不介意{1}}将在你的听众中,你也可以传递this而不是null,但是因为附加事件监听器使用此方法,您希望someDiv[i]成为附加侦听器的对象,我在我提供的示例中坚持这种行为。

答案 1 :(得分:2)

bind执行两项任务:它在稍后调用函数时为函数设置this值,并预先填充函数参数。如果您只想设置this值,则将其作为第一个参数传递。第一个之后的任何参数都用于“预填充”函数参数。

在您的情况下,您只想预先填充参数,因此请将bind的第一个参数设置为nullwindow或其他任何内容。 i应该是第二个参数。

buffTest.bind(
  null, // doesn't matter
  i     // pre-fills the first argument to buffTest
)

答案 2 :(得分: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);
    }
}