Javascript 为什么setInterval会产生无限循环

Javascript 为什么setInterval会产生无限循环,javascript,jquery,time,setinterval,Javascript,Jquery,Time,Setinterval,我试图设置一个计时器,以便它显示用户剩余的秒数和分钟数,我使用setInterval来获取秒数,如果有60秒,它将减少用户剩余的1分钟。 问题是,每次我试着去做的时候,我都会得到无限的foorloops 差不多 var userObj = { name: "", min: 0, sec:0 } function timerCount() { while (userObj.sec !== 0) { console.log(userObj.min)

我试图设置一个计时器,以便它显示用户剩余的秒数和分钟数,我使用setInterval来获取秒数,如果有60秒,它将减少用户剩余的1分钟。 问题是,每次我试着去做的时候,我都会得到无限的foorloops

差不多

var userObj = {
    name: "",
    min: 0,
    sec:0
}

function timerCount() {
    while (userObj.sec !== 0) {
        console.log(userObj.min)
        if (userObj.sec == 0) {
            setInterval(function() {
                userObj.min--;
                userObj.sec = 59     
            }, 1000);
        }
        while(userObj.sec !== 0) {
            setInterval(function() {
                console.log(userObj.sec)
                userObj.sec--;  
            }, 1000);
        }
    }
}
不费吹灰之力,我们就可以消除导致问题的while循环。我们还想检查等于0的分和秒,以便知道何时结束计时器


不费吹灰之力,我们就可以消除导致问题的while循环。我们还要检查等于0的分和秒,以便知道何时结束计时器。

您将设置间隔放入循环中(以及其他内容)

不需要将时间分为分钟和秒,只需要用秒来计算并做一些数学运算

下面是一个有效的代码:

var userObj = {
    name: "Joe",
    sec: 3605
}

function timerCount()
{
    var interval = setInterval(function()
    {
        console.log(getTimeLeft(userObj.sec));
        userObj.sec--;
        if(userObj.sec == 0)
        {
            clearInterval(interval);
            console.log('NO MORE TIME');
        }
    }, 1000);
}

function getTimeLeft(sec)
{
    var seconds = Math.floor( sec % 60 );
    var minutes = Math.floor( (sec / 60) % 60 );
    var hours = Math.floor( (sec / 60 / 60) );

    return {
        'hours' : hours,
        'minutes': minutes,
        'seconds': seconds
    }
}

timerCount();

您将setInterval放入一个循环中(以及其他内容)

不需要将时间分为分钟和秒,只需要用秒来计算并做一些数学运算

下面是一个有效的代码:

var userObj = {
    name: "Joe",
    sec: 3605
}

function timerCount()
{
    var interval = setInterval(function()
    {
        console.log(getTimeLeft(userObj.sec));
        userObj.sec--;
        if(userObj.sec == 0)
        {
            clearInterval(interval);
            console.log('NO MORE TIME');
        }
    }, 1000);
}

function getTimeLeft(sec)
{
    var seconds = Math.floor( sec % 60 );
    var minutes = Math.floor( (sec / 60) % 60 );
    var hours = Math.floor( (sec / 60 / 60) );

    return {
        'hours' : hours,
        'minutes': minutes,
        'seconds': seconds
    }
}

timerCount();

这是您可以想到的另一种方法:

function timer(min, sec){   
    if (min === 0 && sec === 0) return;

    setTimeout(function(){
       console.log(min, sec);

       if (min > 0 && sec === 0) timer(min-1, 59);
       if (sec > 0) timer(min, sec-1);  
    }, 1000);
 }
您可以调用此计时器:

timer(userObj.min, 0)

这是您可以想到的另一种方法:

function timer(min, sec){   
    if (min === 0 && sec === 0) return;

    setTimeout(function(){
       console.log(min, sec);

       if (min > 0 && sec === 0) timer(min-1, 59);
       if (sec > 0) timer(min, sec-1);  
    }, 1000);
 }
您可以调用此计时器:

timer(userObj.min, 0)

您需要将
setInterval()
存储在变量中,然后
clearInterval(variable)
停止它,否则它将在浏览器或节点中无限调用JavaScript。js是一种事件驱动语言,是单线程的,因此您不能在
while()
循环中循环,并期望执行任何其他计时器代码。计时器回调将永远不会执行,直到您完成
while()
循环。所以,你不能像这样等待计时器更新某些东西。计时器永远不会执行,因此您将有一个无限循环。这里至少有几个问题。1) 您正在while循环中调用setInterval()。setInterval()设置要重复调用的回调(本例中每1000毫秒一次)。但是您在while循环中调用setInterval(),因此您设置了多个并行执行的间隔。2) setInterval()中的回调函数与其余代码异步调用。因此,您不能在回调中修改userObj.sec,并看到它们以预期的方式影响while循环。您需要将
setInterval()
存储在变量中,然后
clearInterval(variable)
停止它,否则它将在浏览器或node中无限调用JavaScript。js是一种事件驱动语言,是单线程的,因此您不能在
while()
循环中循环并期望执行任何其他计时器代码。计时器回调将永远不会执行,直到您完成
while()
循环。所以,你不能像这样等待计时器更新某些东西。计时器永远不会执行,因此您将有一个无限循环。这里至少有几个问题。1) 您正在while循环中调用setInterval()。setInterval()设置要重复调用的回调(本例中每1000毫秒一次)。但是您在while循环中调用setInterval(),因此您设置了多个并行执行的间隔。2) setInterval()中的回调函数与其余代码异步调用。因此,您不能在回调中修改userObj.sec,并看到它们以预期的方式影响while循环。