2012-07-14 107 views
2

以下腳本輸出1 2 3 4 5 6 7 ..我假設它會輸出0 1 2 3 4 5 ...爲什麼在傳遞迴調時,此對象調用函數的Javascript setInterval不計算內部參數?

事實上,在我的實際代碼中,我相信print(lostCnt)總是連接到最新的(像全球一樣)最後一次計數更新。爲什麼是這樣?我能做些什麼來讓它保持實際的cnt約束,我不能修改obj1中的任何代碼。

<!DOCTYPE html> 

<html> 
<head> 
<script type="text/javascript"> 
function obj1(parameter, callback){ 
    setTimeout(callback, parameter); 
} 
function caller(){ 
    function miscFunction(cnt){ 
     document.getElementById("main").appendChild(document.createTextNode(cnt)); 
    } 
    var lostCnt = 0; 
    setInterval(
     function(){ 
      new obj1(5, 
       function(){ 
        miscFunction(lostCnt); 
       }); 
      lostCnt++; 
     },5000 
    ); 
} 
</script> 


</head> 
<body onload="caller();"> 
<div id="main"> 
</div> 
</body> 

</html> 

謝謝,這是我的第一篇文章

+0

顯示我的代碼。 – corazza 2012-07-14 00:59:22

+0

對不起,剛添加了代碼 – 2012-07-14 00:59:56

回答

1

lostCnt++第一次調用miscFunction()之前執行。

obj1構造函數在構造之後不會顯示數字,直到5毫秒。只有在此時調用回調函數,回調纔會直接引用lostCnt - 而不是創建obj1實例時的保存副本。

所以你的假設是正確的,我認爲這是很明顯—傳遞給obj1構造直接引用lostCnt回調。

如果你想以不同的方式做到這一點,你可以這樣做:

setInterval(
    function(){ 
     new obj1(5, 
      function(savedLostCnt) { 
      return function(){ 
       miscFunction(savedLostCnt); 
      }; 
      }(lostCnt)); 
     lostCnt++; 
    },5000 
); 
+1

這不是Javascript的正確假設。請參閱[JavaScript閉包如何工作?](http://stackoverflow.com/questions/111102/how-do-javascript-closures-work)以獲取更多詳細信息。 – 2012-07-14 01:06:30

+0

@DavidWitherspoon不,這個函數是在調用obj1構造函數的時候構建的,但是當它被寫入時,它在**執行**時引用了'lostCnt'的值。 – Pointy 2012-07-14 01:07:19

相關問題