• setTimeout和setInterval相互实现


    1、简单区分setTimeout和setInterval

    setInterval在执行完一次代码之后, 经过了那个固定的时间间隔, 它还会自动重复执行代码, 而setTimeout只执行一次那段代码。

    2、利用setTimeout实现setInterval

    1. function mySetInterval(fn, wait) {
    2. let timer = null
    3. function interval() {
    4. fn()
    5. timer = setTimeout(todo, wait);
    6. }
    7. interval()
    8. }

    带清除定时器版本

    1. function mySetInterval(fn, wait) {
    2. let timer = null
    3. function interval() {
    4. fn()
    5. timer = setTimeout(todo, wait);
    6. }
    7. interval()
    8. return () => clearTimeout(timer) //可以取消掉
    9. }
    10. let a = mySetInterval(() => {
    11. console.log(111);
    12. }, 1000)
    13. //可以清除掉定时器
    14. setTimeout(() => {
    15. a() //可以取消掉
    16. }, 1000);

    3、利用setInterval实现setTimeout

    1. function mySetInterval(fn, t) {
    2. const timer = setInterval(() => {
    3. clearInterval(timer)
    4. fn()
    5. }, t)
    6. }
    7. mySetInterval(() => {
    8. console.log('hoho');
    9. }, 1000)

    4、扩展思考:为什么要用 setTimeout 模拟实现 setInterval?setInterval 的缺陷是什么?

    这里只做粗略回答:

    为什么要用 setTimeout 模拟实现 setInterval?

    定时器指定的时间间隔,表示的是何时将定时器的代码添加到消息队列,而不是何时执行代码。所以真正何时执行代码的时间是不能保证的,取决于何时被主线程的事件循环取到,并执行。

    可以这么理解: 每个 setTimeout 产生的任务会直接 push 到任务队列中; 而 setInterval 在每次把任务 push 到任务队列前, 都要进行一下判断(看上次的任务是否仍在队列中, 如果有则不添加, 没有则添加)。

    setInterval 的缺陷是什么 ?

    1、推入任务队列后的时间不准确:在 setInterval 被推入任务队列时,如果在它前面有很多任务或者某个任务等待时间较长比如网络请求等,那么这个定时器的执行时间和我们预定它执行的时间可能并不一致。

    2、函数操作耗时过长会导致不准确:假如定时器里面的代码需要进行大量的计算(耗费时间较长),或者是 DOM 操作。这样一来,花的时间就比较长,有可能前一次代码还没有执行完,后一次代码就被添加到队列了。也会导致定时器变得不准确,甚至出现同一时间执行两次的情况。

  • 相关阅读:
    使用riscv-tests进行指令测试(二)
    dvadmin-打包发布-nginx-静态服务器配置-防火墙设置
    JIRA8.15.X升级JIRA8.20.X流程概述(适用于其他版本)
    常见的8种排序(含代码):插入排序、冒泡排序、希尔排序、快速排序、简单选择排序、归并排序、堆排序、基数排序
    xss测试步骤总结
    AppScan内部、外部手工扫描
    LINUX|ubuntu常用指令
    Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.2 从零移植 Ubuntu,基于RISC-V
    前端飞机大战小游戏
    高频电子线路——分频网络
  • 原文地址:https://blog.csdn.net/qq_42181069/article/details/125521679