JavaScript:如何让setInterval()现在开始?

我正在使用setInterval()函数每20秒调用一个函数。 然而,我注意到的一件事是,它第一次实际调用函数是在20秒(而不是当setInterval()时)。 这是我目前的解决方法:

 dothis(); var i = setInterval(dothis, 20000); 

有没有办法实现这一点,而没有这个重复的代码?

你的方法是这样做的正常方式。

如果反复出现,你可以创build一个实用的函数来执行处理程序,然后设置时间间隔:

 function setIntervalAndExecute(fn, t) { fn(); return(setInterval(fn, t)); } 

然后,在你的代码中,你可以这样做:

 var i = setIntervalAndExecute(dothis, 20000); 

您可以创build一个匿名函数并立即调用它,除了使用setTimeout函数而不是setInterval。

 (function doStuff() { //Do Stuff Here setTimeout(doStuff,20000); })(); 

这将执行该function,然后在20秒内再次调用它。

请注意,取决于您期望的行为或某些情况下的性能,最好使用setTimeout超过setInterval。 主要区别在于,只要超时结束,setInterval就会调用该函数,如果最后一次调用已经完成或发生错误,则返回无效。 使用setTimeout可以确保函数在定时器重置之前完成执行。 很多权衡是非常明显的,但在devise应用程序时要记住它是一件好事。

编辑为了回应帕特里克·dw关心有需要取消超时。 最好的解决scheme是不使用匿名函数,只是在声明后调用它

 var timeout; function doStuff() { //doStuff timeout = setTimeout(doStuff,20000); } doStuff() 

是的,这与OP试图避免的类似,但是它不需要调用函数,然后调用setInterval函数,因此可以保存一行代码。 您可以随时通过以下方式停止并启动该function:

 //Stop it clearTimeout(timeout); //Start it doStuff(); 

如果你的函数没有其他的返回值需要,你可以让它自己返回。

这将允许您调用并同时传递它。 如果返回值被忽略,它将是无害的。

 function dothis() { // your code return dothis; } var i = setInterval(dothis(), 20000); 

否则,你可以扩展Function.prototype给所有你的函数调用和返回函数:

DEMO: http : //jsfiddle.net/ZXeUz/

 Function.prototype.invoke_assign = function() { var func = this, args = arguments; func.call.apply( func, arguments ); return function() { func.call.apply( func, args ); }; }; setInterval( dothis.invoke_assign( 'thisArg', 1, 2, 3 ), 20000 ); // thisArg 1 2 3 // thisArg 1 2 3 // thisArg 1 2 3 // ... 

这实际上增强了一些东西。 它可以让你传递一组参数。 第一个参数将设置您正在调用的函数的this值,其余的参数将作为常规parameter passing。

因为返回的函数被封装在另一个函数中,所以在初始调用和间隔调用之间会有相同的行为。