我正在使用jQuery animate方法,我想在动画完成时调用一个函数。由于函数在循环中被多次调用,我需要访问一些变量但不知道如何执行此操作(我猜测与闭包有关)。
我有:
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;
}
所以我需要在计算时访问xPos和yPos,因为稍后会调用回调。
JD。
答案 0 :(得分:3)
使用第二个闭包:
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
将其移动到块范围内。
答案 1 :(得分:1)
试试这个:
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;
}
答案 2 :(得分:0)
你有一个关闭。您应该已经可以访问这两个变量。你能发布确切的代码请求吗?
答案 3 :(得分:-1)
我让它以这种方式工作:http://jsfiddle.net/gailbear/WbNdx/6/
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;
}
我得到的第一个错误是“不要在循环中定义函数”。如果该代码有帮助,请告诉我。
答案 4 :(得分:-2)
您可以将它们定义为全局变量,意味着在任何函数或对象之外。然后你可以从任何地方访问它们。