开发者社区> 问答> 正文

为什么使用 setTimeout 实现 setInterval?怎么模拟?

为什么使用 setTimeout 实现 setInterval?怎么模拟?

展开
收起
请回答1024 2020-04-07 20:49:07 1992 0
1 条回答
写回答
取消 提交回答
  • 相关知识点:

    // 思路是使用递归函数,不断地去执行 setTimeout 从而达到 setInterval 的效果

    function mySetInterval(fn, timeout) { // 控制器,控制定时器是否继续执行 var timer = { flag: true };

    // 设置递归函数,模拟定时器执行。 function interval() { if (timer.flag) { fn(); setTimeout(interval, timeout); } }

    // 启动定时器 setTimeout(interval, timeout);

    // 返回控制器 return timer; }

    回答:

    setInterval 的作用是每隔一段指定时间执行一个函数,但是这个执行不是真的到了时间立即执行,它真正的作用是每隔一段时间将事件加入事件队列中去,只有当当前的执行栈为空的时候,才能去从事件队列中取出事件执行。所以可能会出现这样的情况,就是当前执行栈执行的时间很长,导致事件队列里边积累多个定时器加入的事件,当执行栈结束的时候,这些事件会依次执行,因此就不能到间隔一段时间执行的效果。

    针对 setInterval 的这个缺点,我们可以使用 setTimeout 递归调用来模拟 setInterval,这样我们就确保了只有

    2020-04-07 20:49:42
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载