我有以下内容:
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中的数字。任何有关此事的帮助都非常感谢,提前感谢任何信息。
答案 0 :(得分:4)
这可能只是因为bind
的第一个参数是this
值。
你可能想要这个:
someDiv[i].onclick = buffTest.bind(someDiv[i], i);
编辑:就像@bfavarette所说,如果你不介意{1}}将在你的听众中,你也可以传递this
而不是null
,但是因为附加事件监听器使用此方法,您希望someDiv[i]
成为附加侦听器的对象,我在我提供的示例中坚持这种行为。
答案 1 :(得分:2)
bind
执行两项任务:它在稍后调用函数时为函数设置this
值,并预先填充函数参数。如果您只想设置this
值,则将其作为第一个参数传递。第一个之后的任何参数都用于“预填充”函数参数。
在您的情况下,您只想预先填充参数,因此请将bind
的第一个参数设置为null
或window
或其他任何内容。 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);
}
}