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

选项A:

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

myTimeoutFunction();

选项B:

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

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


当前回答

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

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

myTimeoutFunction();

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

其他回答

控制台的区别很明显:

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

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

setInterval()

setInterval()是一种基于时间间隔的代码执行方法,它具有在达到时间间隔时重复运行指定脚本的本机能力。脚本作者不应将其嵌套到回调函数中以使其循环,因为默认情况下它会循环。除非您调用clearInterval(),否则它将在间隔时间内继续激发。

如果您想为动画或时钟周期循环代码,请使用setInterval()。

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setInterval(doStuff, 5000);

setTimeout()

setTimeout()是一种基于时间的代码执行方法,当达到时间间隔时,只执行一次脚本。除非您将setTimeout()对象嵌套在要运行的函数内,使其循环脚本,否则它不会再次重复。如果调整为循环,除非调用clearTimeout(),否则它将在间隔时间内继续发射。

function doStuff() {
    alert("run your code here when time interval is reached");
}
var myTimer = setTimeout(doStuff, 5000);

如果您希望某件事在指定的时间段后发生一次,请使用setTimeout()。这是因为它只在达到指定间隔时执行一次。

选项A和选项B看起来工作相同的原因主要是因为setInterval和setTimeout函数的位置不同。

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

myTimeoutFunction();

这是一个递归函数,如果doStuff非常复杂,则setTimeout必须跟踪setTimout的所有调用以及当前的doStuff,这会使它变得更慢,而且速度更快。

function myTimeoutFunction()
{
    doStuff();
}

myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);

另一方面,setInterval只需要跟踪上一个setInterval和当前的doStuff,使其保持恒定的速度。

So which one should you use?

从上面的内容中,您应该能够得出结论,更好的方法是setInterval。

我认为SetInterval和SetTimeout不同。SetInterval根据设置的时间执行块,而SetTimeout执行一次代码块。

在超时倒计时秒后尝试以下代码:

setInterval(function(e){
    alert('Ugbana Kelvin');
}, 2000);

然后尝试

setTimeout(function(e){
    alert('Ugbana Kelvin');
}, 2000);

你可以自己看到不同之处。