2011-03-09 33 views
0

我正在使用jQuery動畫方法,在動畫完成時我想調用一個函數。由於該函數在循環中被多次調用,所以我需要訪問一些變量,但不知道如何執行此操作(我猜想可能與閉包有關)。獲取jQuery的回調函數中的值

我:

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。 JDD。

JD。

+0

你應該有那裏的變量。它在封閉的範圍內......它在做什麼? – Groovetrain 2011-03-09 14:41:21

+0

可能的重複[如何將JS變量的值(不是引用)傳遞給函數?](http://stackoverflow.com/questions/2568966/how-do-i-pass-the-value-不是一個js可變函數的參考) – 2011-03-09 14:45:38

回答

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將其移動到該塊範圍。

+0

誰低估:請留下評論。從我所知道的這是處理循環內部閉包的正確方法。 – ThiefMaster 2011-03-09 14:47:38

+0

非常感謝你,這工作,如何以及爲什麼? – 2011-03-09 14:59:26

+0

JavaScript沒有塊範圍,只是一個函數範圍。所以你的回調函數的閉包保存了變量(不是它的值)'xPos'。因此,在循環結束時,保存的變量(與循環變量相同)具有最終值。通過將該調用包裝成一個匿名函數,該函數將變量作爲參數傳遞,現在將其保存爲一個不會再被修改的新變量。 – ThiefMaster 2011-03-09 15:04:05

-2

您可以將它們定義爲全局變量,意思是在任何函數或對象之外。然後你可以從任何地方訪問它們。

0

您在那裏關閉。你應該已經可以訪問這兩個變量。你能發佈確切的代碼請求?

+0

不,他將始終擁有最後一個'xPos'值作爲閉包。見http://www.mennovanslooten.nl/blog/post/62 – ThiefMaster 2011-03-09 14:46:51

+0

是的,那就是發生了什麼事。 – 2011-03-09 14:53:19

+0

啊,我的不好。抱歉。 – Nikhil 2011-03-09 15:30:36

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

我得到的第一個錯誤是「沒有一個循環內定義的功能」。讓我知道該代碼是否有幫助。

+0

對不起,但這是完全錯誤的。您傳遞新函數的(未定義)返回值而不是函數作爲回調。所以你立即執行函數,而不是應該調用回調函數。 – ThiefMaster 2011-03-09 15:05:27

相關問題