# 实现 setInterval
我们执行一个函数想要隔特定的时间再去执行,我们可以使用 setTimeout、setInterval 来实现。
浏览器返回值是一个数字,Node 环境返回的是一个对象。
# 二者差异
第一个使用 setTimeout
setTimeout(function () {
func();
}, 1000);
第二个使用 setTimeout
setInterval(function () {
func();
}, 1000);
使用 setInterval, 下一次执行会等待一秒,但是 一秒内会执行 func 函数,如果func函数执行时间超过延迟的时间,引擎会等待 func 执行完成,即使它的时间要超过延迟时间,如果每次都会超过,那么就会连续执行,没有停顿。
但是 setTimeout, 下一次执行会先执行完 func 函数,再去延迟执行。所以,它延迟的时间更精准。
# 为什么要释放定时器
定时器延迟阶段,将会为其创建一个内部引用,并保存在调度程序中。如果说它引用了外部变量,那么变量将不会被收回,所以我们不用定时器之后,要将它收回。
# 零延迟
定时器在设置为 0 秒之后,在浏览器并不会真的是 0 秒延迟,HTML5 中所讲:经过 5 重嵌套定时器之后,时间间隔将被设置为至少 4 毫秒。所以每次延迟的数字将会越来越大。
- CPU 过载。
- 浏览器页签处于后台模式。
- 笔记本电脑用的是电池供电。(电池供电会以降低性能为代价提升续航).
所以延迟将会在 300ms ~ 1000ms 之间。
# 模拟实现一个 setInterval
setTimeout(function () {
setTimeout(function () {
}, 100);
}, 100);
setTimeout 给了我们更加灵活的控制后续时间。