2012-01-02 86 views
2

我想用JavaScript構建一個計時器。這裏是我的功能:帶遞歸時間事件的JavaScript遞歸(setTimeout)

var t; 
function time(num){ 
    var buf = num; 
    document.getElementById("test").innerHTML=buf; 
    buf++; 
    alert(buf + " " + num); //For troubleshooting 
    t=setTimeout("time(buf)",1000); 
} 

如果我運行時間(0),ID =「test」的零件沒有任何反應。 num總是等於0和buf每次函數被調用時總是等於1(來自警報函數)。

我對Java和C很滿意,而且我知道這會適用於這些語言。我知道JavaScript也是一種傳值語言,爲什麼這個計時器不工作?

而且,爲什麼沒有發生,當我試圖(和改變了所有的BUFNUM

t=setTimeout("time(num)",1000); 

我知道有其他的方法來創建一個計時器,但我想知道爲什麼此方法不起作用。謝謝。

+0

你可能認爲這是遞歸,但它實際上不是。 'time()'被調用,然後調用'setTimeout()'並傳遞稍後將被執行的字符串。然後,'time()'返回,一段時間後,'time()'被計時器代碼再次調用。這不是技術上的遞歸。第一次調用'time()'在第二次調用之前已經完成。你只是在安排第二次電話會在未來一段時間。 – jfriend00 2012-01-02 06:41:20

回答

2

當您將字符串傳遞給setTimeout時,會在時間到時進行評估。在這種情況下,當時間到了,變量不再有任何變量,並且代碼會拋出錯誤。

你應該自己替換這個值。

t = setTimeout("time(" + buf + ")",1000); 

或者,更好的是,傳遞一個函數,而不是字符串的

t = setTimeout(function() { 
    time(buf); 
}, 1000); 
4

避免將字符串setTimeout。當你這樣做時,字符串或多或少地被執行爲eval,由於許多原因這是邪惡的。有關更多信息,請參閱this question

相反,請考慮將匿名函數傳遞給setTimeout。這將使解決你的問題微不足道:

t = setTimeout(function() { time(buf); }, 1000);