Javascript 在jquery的回调函数中获取值
我正在使用jqueryanimate方法,在该方法中,我希望在动画完成时调用一个函数。由于该函数在一个循环中被多次调用,因此我需要访问一些变量,但不知道如何执行此操作(我想这与闭包有关) 我有:Javascript 在jquery的回调函数中获取值,javascript,jquery,closures,Javascript,Jquery,Closures,我正在使用jqueryanimate方法,在该方法中,我希望在动画完成时调用一个函数。由于该函数在一个循环中被多次调用,因此我需要访问一些变量,但不知道如何执行此操作(我想这与闭包有关) 我有: while (i<numberofTimeIntervals) { // some calculations here xPos = initialPosX + x + "px"; yPos = initialPosY - y + "px"; $("
while (i<numberofTimeIntervals)
{
// some calculations here
xPos = initialPosX + x + "px";
yPos = initialPosY - y + "px";
$("#object").animate({left: xPos},10).animate({top: yPos},10, function(){ console.log(xPos) }); <-- what I want here is the access to xPos and yPos
i = i + 1;
}
while(i你可以将它们定义为全局变量,意思是在任何函数或对象之外。然后你可以从任何地方访问它们。你在那里有一个闭包。你应该已经可以访问这两个变量了。你能发布准确的代码吗?请使用第二个闭包:
while(i<numberofTimeIntervals)
{
var xPos = initialPosX + x + "px";
var yPos = initialPosY - y + "px";
(function(xPos) {
$('#object').animate({left: xPos},10).animate({top: yPos},10, function(){ console.log(xPos) });
})(xPos);
i++;
}
while(我试试这个:
while (i<numberofTimeIntervals) {
//<!-- some calculations here--->
(function(){
var
xPos = initialPosX + x + "px",
yPos = initialPosY - y + "px";
$("#object")
.animate({left: xPos},10)
.animate({top: yPos},10, function(){ console.log(xPos) });
//<-- what I want here is the access to xPos and yPos
})();
i = i + 1;
}
while(i我让它这样工作:
函数printme(xpos){
console.log(xpos);
}
while(i
我遇到的第一个错误是“不要在循环中定义函数”。如果代码有帮助,请告诉我。你应该在那里有变量。它在闭包的范围内…它在做什么?可能重复的否,他将始终使用最后一个xPos
值作为闭包。请看,是的,这就是正在发生的事情。否决者:请留下评论。据我所知,这是正确的处理方法loops.JavaScript中的闭包没有块作用域,只有一个函数作用域。因此回调函数的闭包保存变量(不是它的值)xPos
。因此,在循环结束时,保存的变量(与循环变量相同)具有最终值。通过将调用包装在一个匿名函数中,将变量作为参数传递,它现在保存为一个新变量,不再修改。@ThiefMaster:Imo您应该将注释放在a中nswer,让它变得更好;)我想说这不是一个闭包,因为你没有访问父作用域的变量……但这是一个吹毛求疵。+1来补偿-1…@felix:将它添加到我的回答中你不能真正将缺少let
支持归因于IE-没有任何版本支持它,包括IE 9-let
是对ECMAScript规范的Mozilla扩展JavaScript所基于的.FWIW、Chrome和许多其他浏览器也不支持它,尽管它可能很有用。很抱歉,这是完全错误的。您将一个新函数的(未定义的)返回值传递给回调函数,而不是将一个函数作为回调函数。因此,您可以立即执行该函数,而不是在调用回调函数时执行该函数。
function printme(xpos){
console.log(xpos);
}
while (i < numberofTimeIntervals) {
var xPos = initialPosX + x + "px";
var yPos = initialPosY - y + "px";
$("#object").animate({
left: xPos
}, 10).animate({
top: yPos
}, 10, printme(xPos));
i = i + 1;
}