据我所知,这两个javascript的行为方式相同:

选项A:

function myTimeoutFunction()
{
    doStuff();
    setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

选项B:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

使用setTimeout和setInterval之间有什么区别吗?


当前回答

当您运行以下javascript或检查此JSFiddle时,您可以自己验证bobcen答案

<div id="timeout"></div>
<div id="interval"></div>

var timeout = 0;
var interval = 0;

function doTimeout(){
    $('#timeout').html(timeout);
    timeout++;
    setTimeout(doTimeout, 1);
}

function doInterval(){
    $('#interval').html(interval);
    interval++;
}

$(function(){
    doTimeout();
    doInterval();
    setInterval(doInterval, 1);
});

其他回答

当您在setInterval中运行某个函数时,它的工作时间比超时时间长->浏览器将被卡住。-例如,doStuff()需要1500秒才能执行,您需要:setInterval(doStuff,1000);1) 浏览器运行doStuff(),需要1.5秒才能执行;2) 约1秒后,它尝试再次运行doStuff()。但之前的doStuff()仍在执行->所以浏览器将此运行添加到队列中(在第一次完成后运行)。3,4,..) 相同的添加到下一次迭代的执行队列中,但上一次的doStuff()仍在进行中。。。结果,浏览器卡住了。为了防止这种行为,最好的方法是在setTimeout内运行setTimeout以模拟setInterval。要纠正setTimeout调用之间的超时,可以使用JavaScript的setInterval技术的自我纠正替代方法。

您的代码将具有不同的执行间隔,在某些项目中,例如在线游戏,这是不可接受的。首先,您应该怎么做,以使代码在相同的整数下工作,您应该将“myTimeoutFunction”更改为:

function myTimeoutFunction()
{
    setTimeout(myTimeoutFunction, 1000);
    doStuff();
}
myTimeoutFunction()

此更改后,它将等于

function myTimeoutFunction()
{
    doStuff();
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

但是,您仍然不会得到稳定的结果,因为JS是单线程的。目前,如果JS线程将忙于某些事情,它将无法执行回调函数,并且执行将延迟2-3毫秒。您是否每秒执行60次,并且每次您有1-3秒的随机延迟,这是绝对不可接受的(一分钟后,大约会有7200毫秒的延迟),我可以建议您使用类似的方法:

    function Timer(clb, timeout) {
        this.clb = clb;
        this.timeout = timeout;
        this.stopTimeout = null;
        this.precision = -1;
    }

    Timer.prototype.start = function() {
        var me = this;
        var now = new Date();
        if(me.precision === -1) {
            me.precision = now.getTime();
        }
        me.stopTimeout = setTimeout(function(){
            me.start()
        }, me.precision - now.getTime() + me.timeout);
        me.precision += me.timeout;
        me.clb();
    };

    Timer.prototype.stop = function() {
        clearTimeout(this.stopTimeout);
        this.precision = -1;
    };

    function myTimeoutFunction()
    {
        doStuff();
    }

    var timer = new Timer(myTimeoutFunction, 1000);
    timer.start();

此代码将保证稳定的执行周期。即使线程也会很忙,您的代码将在1005毫秒后执行,下次它将有995毫秒的超时,结果将是稳定的。

不同之处在于它们的目的。

setInterval()
   -> executes a function, over and over again, at specified time intervals  

setTimeout()
   -> executes a function, once, after waiting a specified number of milliseconds

就这么简单

此处提供更多详细信息http://javascript.info/tutorial/settimeout-setinterval

setInterval可以更容易地取消代码的未来执行。如果使用setTimeout,则必须跟踪计时器id,以防以后取消它。

var timerId = null;
function myTimeoutFunction()
{
    doStuff();
    timerId = setTimeout(myTimeoutFunction, 1000);
}

myTimeoutFunction();

// later on...
clearTimeout(timerId);

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
var timerId = setInterval(myTimeoutFunction, 1000);

// later on...
clearInterval(timerId);

我使用setTimeout。

显然,区别在于setTimeout只调用一次方法,setInterval则重复调用它。

这是一篇很好的文章,解释了两者的区别:教程:带有setTimeout和setInterval的JavaScript计时器