# 实现 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 毫秒。所以每次延迟的数字将会越来越大。

  1. CPU 过载。
  2. 浏览器页签处于后台模式。
  3. 笔记本电脑用的是电池供电。(电池供电会以降低性能为代价提升续航).

所以延迟将会在 300ms ~ 1000ms 之间。

# 模拟实现一个 setInterval

setTimeout(function () {
    setTimeout(function () {
        
    }, 100);
}, 100);

setTimeout 给了我们更加灵活的控制后续时间。