蘑菇小姐会开花

有关setTimeout和setInterval

基本用法

1.setTimeout指定延迟后调用函数
2.setInterval以指定周期调用函数
setTimeout和setInterval,将指定的代码移出本次执行,等到下一轮事件轮询时,再检查是否到了指定的时间。如果到了,就执行对应的代码;如果不到,就等到再下一轮事件轮询时重新判断。

JavaScript是运行在单线程的环境中,定时器仅仅是计划代码在未来的某个时间执行,而具体执行时机是不能保证的

setTimeout

1
setTimeout(function() {...}, timer);

为了确保两次执行之间有固定的间隔,可以不用setInterval,而是每次执行结束后,使用setTimeout指定下一次执行的具体时间。

1
2
setTimeout(someTask, 100);
veryLongTask();

setTimeout指定100ms以后运行someTask,但是,如果后面的veryLongTask函数运行时间很长,过了100ms还没结束,那someTask就得等到veryLongTask运行结束才执行。

setInterval

1
setInterval(function() {...}, interval);

setInterval并不能保证两个函数之间的调用的间隔一定是与interval相符合的时间,周期会受function执行时间影响。
setInterval指定的是”开始执行之间的间隔“,并不考虑每次任务执行本身所消耗的时间。因此实际上,两次执行之间的间隔会小于指定的时间。比如,setInterval指定每100ms执行一次,每次执行需要5ms,那么第一次执行结束后95毫秒,第二次执行就会开始。如果某次执行耗时特别长,比如需要105毫秒,那么它结束后,下一次执行就会立即开始。

1
2
3
4
5
6
7
setInterval(function () {
console.log(2);
}, 1000);

(function () {
sleeping(3000);
})();

setInterval要求每隔1s输出一个2,但是sleeping要3s才能完成,就会导致在sleeping完成以后连续输出两个2,然后开始每隔1s输出一个2。
setInterval具有累积效应,如果某个操作特别耗时,超过了setInterval的时间间隔,排在后面的操作会被累积起来,然后在很短的时间内连续触发,可能会造成性能问题。

更多请参考:

setTimeout 和setInterval 何时被调用执行
你真的了解setTimeout 和setInterval 吗
定时器-阮一峰

坚持原创技术分享,您的支持将鼓励我继续创作!