2014-03-29 38 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