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

选项A:

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

myTimeoutFunction();

选项B:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

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


当前回答

要考虑的重要一点是性能。使用setTimeout周期性运行函数的唯一方法是用目标函数递归地调用它,当您检查它时,它似乎以异步方式工作。当您看到调用堆栈时,您会发现它一直在增长。事实上,这是明智的。由于Javascript不支持多线程,因此不可能在完成子函数之前完成对父函数的调用,因此,只要有递归调用,堆栈就会继续增长。同时,使用setInterval,我们不需要递归调用目标函数,因为它有一个作为循环周期性运行的逻辑。因此,这保持了调用堆栈的清洁。您可以在浏览器中使用开发人员的工具查看调用堆栈,您会注意到其中的差异。

当长时间使用小间隔时,差异将很明显。

其他回答

从另一个角度来看:setInterval确保代码在每个给定的时间间隔(即1000毫秒,或您指定的时间间隔)运行,而setTimeout设置它“等待”直到运行代码的时间。而且,由于运行代码需要额外的毫秒,所以它总共需要1000毫秒,因此setTimeout会以不精确的时间(超过1000毫秒)再次运行。

例如,计时器/倒计时不是用setTimeout完成的,而是用setInterval完成的,以确保它不会延迟,并且代码以精确的给定间隔运行。

好吧,setTimeout在一种情况下更好,正如我刚刚学到的。我总是使用setInterval,我让它在后台运行了半个多小时。当我切换回该选项卡时,幻灯片(使用代码的幻灯片)的变化非常快,而不是每5秒一次。事实上,随着我对它进行更多的测试,它确实会再次发生,这是否是浏览器的错误并不重要,因为使用setTimeout,这种情况是完全不可能的。

如果您想取消超时,我发现setTimeout方法更容易使用:

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

myTimeoutFunction();

此外,如果函数中出现错误,它将在第一次错误时停止重复,而不是每秒重复错误。

当您运行以下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可以更容易地取消代码的未来执行。如果使用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);