据我所知,这两个javascript的行为方式相同:
选项A:
function myTimeoutFunction()
{
doStuff();
setTimeout(myTimeoutFunction, 1000);
}
myTimeoutFunction();
选项B:
function myTimeoutFunction()
{
doStuff();
}
myTimeoutFunction();
setInterval(myTimeoutFunction, 1000);
使用setTimeout和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和setTimeout都返回一个计时器id,您可以使用它来取消执行,即在触发超时之前。要取消,请调用clearInterval或clearTimeout,如下所示:
var timeoutId = setTimeout(someFunction, 1000);
clearTimeout(timeoutId);
var intervalId = setInterval(someFunction, 1000),
clearInterval(intervalId);
此外,当您离开页面或关闭浏览器窗口时,超时会自动取消。