2014-03-29 39 views
2

我是編程新手,所以請不要苛刻我的技能。無論如何,這是我的代碼,我試圖做一個簡單的倒計時循環。我的JavaScript循環是一個無限循環?

var number = 30; 
var countdown = true; 

while(countdown === true) { 
    subtract(); 
    if(number === 0) { 
     countdown = false; 
    } 
} 

function subtract() { 
    setTimeout(function() { 
     console.log(number); 
     number = number - 1; 
    }, 1000); 
} 

我做錯了什麼?

+2

'的setTimeout()'排隊功能最多稍後執行,但_doesn't暫停當前function._的執行,因此您的超時可能會發生,直到_after_ while循環結束 - 它永遠不會因爲它正在測試在超時設置的值... – nnnnnn

+0

看看你的cpu使用情況,同時運行此代碼;)while while循環是一個資源豬。 – andrew

回答

2

JavaScript具有功能級塊執行。一個函數在另一個函數被賦予執行能力之前運行完成。 while循環保持執行指揮棒,所以setTimeout中的其他函數永遠都不會有機會。

+0

謝謝你,以及其他所有誰給了我建議setTimeout() – user3474711

+0

我會upvote的答案,但我還不能。這是我第一次用一個帳戶使用Stackoverflow。 – user3474711

+0

什麼是門檻,10代表?我認爲你現在應該有這個。 –

1

儘管在這種情況下調用javascript是異步的,但在第一個完成之前它不調用減法函數。 (細節http://ejohn.org/blog/how-javascript-timers-work/

這應該工作

var number = 30; 

setTimeout(function() { 
    console.log(number); 
    number = number - 1; 
}, 1000); 
+0

這不會迭代30次。請參閱@Malk的解答,瞭解如何使用setInterval。 – cybersam

0

當使用setTimeout函數你actualy調用X毫秒後的函數(在這種情況下,X = 1000,這是1秒)。

'雖然'是你想要做的倒計時功能,對吧?所以在你減函數只是寫:

console.log(number); 
number = number - 1; 

您也可以刪除減函數,只是寫:

while(countdown === true) { 
    console.log(number); 
    number = number - 1; 
    if(number === 0) { 
     countdown = false; 
    } 
} 

或摔落而功能:

function subtract() { 
    id(countdown === true) 
    setTimeout(function() { 
     console.log(number); 
     number = number - 1; 
     subtract(); 
    }, 1000); 
    else countdown = false; 
} 
subtract(); 
1

setInterval是函數設置一個函數定期運行。 https://developer.mozilla.org/en-US/docs/Web/API/Window.setInterval

var number = 30; 
var countdown = true; 
var timer; 

function update(){ 
    console.log(number); 
    number = number - 1; 
    if (number === 0) 
     clearInterval(timer); 
} 


timer = setInterval(update, 1000); 
+0

感謝您的修復!你可以或者向我解釋什麼是timer = setInterval(update,1000);手段?就像一個關於它如何工作的小例子?我可以說出每件作品的含義,但我真的很想知道它的真正含義。 – user3474711

+0

檢查我發佈的鏈接。這一切都已經佈置和演示。 – Malk

+0

是的,我只是注意到了鏈接。謝謝! – user3474711