2015-06-15 55 views
4

我使用JavaScript和JQuery創建了一個倒計時「Pomodoro」計時器。我所指的代碼片段如下:當()包含在調用中時,JavaScript遞歸函數中斷

var time = 1500; 
var cycle = "long"; 
var tracker = 0; 
var paused = false; 

//Timer countdown function 
function countdown(){ 
    if (!paused) { 

     var seconds = ("00" + (time % 60)).slice(-2); 

     $("#time").text(Math.floor(time/60) + ":" + seconds); 
     $("title").text(Math.floor(time/60) + ":" + seconds); 

     if (time > 0){ 
     time--; 
     setTimeout(countdown, 1000); 
     //Once the time is up, determine cycle, play chime and reset timer. 
     } else { 
      document.getElementById("bell").play(); 
      tracker++; 

      if (tracker == 7) { 
       cycle = "long"; 
       time = 1500; 
       setTimeout(countdown, 1000); 
      } else if (tracker == 8) { 
       time = 1500; 
       setTimeout(countdown, 1000); 
       tracker = 0; 
      } else if (cycle == "short" && tracker < 7) { 
       cycle = "long"; 
       time = 1500; 
       setTimeout(countdown, 1000); 
      } else if (cycle == "long" && tracker < 7) { 
       cycle = "short"; 
       time = 300; 
       setTimeout(countdown, 1000); 
      } 
     } 
    } else { 
     setTimeout(countdown, 1); 
    } 
} 
setTimeout(countdown(), 1000); 

該函數調用「setTimeout(countdown,1000);」位於if語句的「else」部分內部會導致程序中斷,如下所示:「setTimeout(countdown(),1000);」,因爲我相信函數通常應該被調用。我完全對此感到困惑,並非常感謝有人提供解釋。

問題:如果在「倒計時」一詞後添加「()」,程序爲什麼會中斷?

+1

'setTimeout'以一個參數作爲參數。所以,我認爲'setTimeout(countdown,1000);'是正確的。 :) –

+0

就像@DavinTryon說的那樣,它需要一個函數。 'countdown()'是執行倒計數功能的語句。如果你想這樣做,你需要將其包裝在一個匿名函數中,即。 '函數(){倒計時()}'。而且,儘管這個問題的措詞,它顯然是重複的。 – Rooster

+0

休息是什麼意思? – RobertoNovelo

回答

1

如果你寫下setTimeout(countdown(), 1000);,基本上當代碼塊被評估時,JS將立即調用countdown()。通過執行setTimeout(countdown, 1000);,您將傳遞對函數countdown的引用作爲第一個參數,因此,根據第二個參數(1000),它不會在1秒後執行。

+0

謝謝,這完美地回答了我的問題。 – Nick

+0

沒問題,很高興幫助你! – taxicala

0

這是一個語法問題。在JavaScript中,您不會在函數的圓括號中傳遞函數的名稱。請參閱this post

+0

你沒有傳遞名稱。你想要傳遞函數本身。 – Bergi