我无法将i的值传递给scMotion函数
for ( i = 0; i < tmp.length; i++ ) {
document.getElementById("sc"+i).onmousedown=function() { return scMotion(i,'up') };
}
为了澄清这个问题,这个for循环正在做其他事情,向dom添加元素。
出于某种原因,即使我在39号,我附加的函数中传递的i值也是i的最终值,即80。
答案 0 :(得分:6)
在键入时有效,因为i
和函数之间应该有一个闭包:
var i="4";
document.getElementById("sc"+i).onmousedown=function() {
return scMotion(i,'up'); // <-- due to the created closure, the i here
// refers to the i above.
};
但请记住,这是一个关闭。所以,下面的场景可能会让你沮丧:
var i="4";
document.getElementById("sc"+i).onmousedown=function() {
return scMotion(i,'up'); // <-- due to the created closure, the i here
// refers to the i above.
// However, when the event happens in the
// future the value of i in here will
// be "5" due to the code below:
};
i = "5";
这是循环问题中的经典闭包。看到这一点,了解发生了什么:Please explain the use of JavaScript closures in loops
答案 1 :(得分:0)
请尝试使用addEventListener。您可以使用id将数字传递给您的函数。
for ( i = 0; i < tmp.length; i++ ) {
var el = document.getElementById( "sc" + i );
if ( el.addEventListener ) {
el.addEventListener( 'mousedown', handleMouseDown );
} else if ( el.attachEvent ) { // for IE8 and previous versions
el.attachEvent( 'mousedown', handleMouseDown );
}
}
function handleMouseDown( event ) {
var num = event.target.id.replace( "sc", "" );
scMotion( num, 'up' );
}