Использовать второе закрытие:
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++;
}
Объяснение: JavaScript не имеет области видимости блока, только область действия функции.Таким образом, закрытие вашей функции обратного вызова сохраняет переменную (а не ее значение) xPos.Таким образом, в конце цикла сохраненная переменная, которая совпадает с переменной цикла, имеет окончательное значение.Оборачивая вызов в анонимную функцию, которая получает переменную, переданную в качестве аргумента, она теперь сохраняется как новая переменная, которая больше не будет изменяться.
Кстати, если у вас был доступ к JavaScript 1.7к сожалению, только несколько браузеров поддерживают его) вы также можете использовать let xPos
вместо var xPos
, чтобы переместить его в область видимости блока.