Javascript 在jquery的回调函数中获取值

Javascript 在jquery的回调函数中获取值,javascript,jquery,closures,Javascript,Jquery,Closures,我正在使用jqueryanimate方法,在该方法中,我希望在动画完成时调用一个函数。由于该函数在一个循环中被多次调用,因此我需要访问一些变量,但不知道如何执行此操作(我想这与闭包有关) 我有: while (i<numberofTimeIntervals) { // some calculations here xPos = initialPosX + x + "px"; yPos = initialPosY - y + "px"; $("

我正在使用jqueryanimate方法,在该方法中,我希望在动画完成时调用一个函数。由于该函数在一个循环中被多次调用,因此我需要访问一些变量,但不知道如何执行此操作(我想这与闭包有关)

我有:

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;
}