$("#canvas").mousedown(function(e) {
for(i=0; i<allPoints[0].length; i++) {
var pointX = controlPoint[i].x;
var pointY = controlPoint[i].y;
var mouseX = e.pageX - this.offsetLeft;
var mouseY = e.pageY - this.offsetTop;
if(pointX + 5 > mouseX && pointX - 5 < mouseX && pointY + 5 > mouseY && pointY - 5 < mouseY) {
var testest = i;
$(this).bind('mousemove', function(e) {
//'i' is undefined here
//'testest' is defined
controlPoint[testest].x = e.pageX - this.offsetLeft;
controlPoint[testest].y = e.pageY - this.offsetTop;
});
}
}
}).mouseup(function(e){
$(this).unbind('mousemove');
});
由于某种原因,当我尝试使用mousemove
函数中for循环的变量'i'时,它是未定义的。如果我将它赋给另一个变量,那么由于某种原因,它将工作,但我不想这样做,因为它似乎是不必要的。任何帮助都将非常感谢。
2条答案
按热度按时间ru9i0ody1#
我不能确定,但我相信它是,因为你的
i
变量是 global。总是用var
关键字声明一个不应该是global
的变量。例如,我认为你的应用程序在其他地方修改了变量
i
,这就是为什么把它赋给另一个变量似乎可以解决你的问题的原因。这里真实的的解决方案是使用一个带有var
关键字的 local 变量。czq61nw12#
i未定义的事实非常奇怪。发生这种情况的唯一方式是在代码的其他地方将其设置为undefined。如果全局变量i从未在其他地方使用过,则i的值将始终等于'mousemove'回调函数中的allPoints[0].length,因为您正在创建一个围绕i变量的闭包。在mousedown回调结束时,将其设置为allPoints[0].length。另外,请注意,testest将被提升到mousedown回调的顶部,因此mousemove回调中的testest值将始终是mousemove回调中设置的最后一个值。