以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
83. 实现一个interval

思路:

实现一个 interval 时间间隔函数,和普通的 interval 不同的是,interval 时间间隔是一个线性函数,需要用到 delay 和 period 两个参数,返回一个 id,用于 clearInterval 的停止。

  1. 设置存储 id 的 count 和存储 callback 的 queue 数组。

  2. 利用 setTimeout 函数递归执行 callback,每次 callback 执行后 delay+period,同时存储当前 setTimeout 返回的 id。

  3. 实现 clearInterval,通过清除之前存储的 setTimeout 的 id 即可停止 setInterval 的执行。

代码实现:

let count = 0;
let queue = [];

function mySetInterval(callback, delay, period) {
  let timeoutId = setTimeout(function () {
    callback();
    count++;
    queue.push(setTimeout(arguments.callee, delay + count * period));
  }, delay);
  queue.push(timeoutId);

  return timeoutId;
}

function myClearInterval(id) {
  clearTimeout(id);

  queue = queue.filter(function (timeoutId) {
    return timeoutId != id;
  });
}

let prev = Date.now();
const func = () => {
  const now = Date.now();
  console.log("roughly ", Date.now() - prev);
  prev = now;
};

const id = mySetInterval(func, 100, 200);

setTimeout(() => {
  myClearInterval(id);
}, 3000);

测试通过。