浅谈对于“不用setInterval,用setTimeout”的理解

浅谈对于“不用setInterval,用setTimeout”的理解

对于JavaScript中定时器的使用,我们常常会听到这样一种建议:不要使用setInterval,而应该使用setTimeout。

为什么会这样说呢?这是因为使用setInterval存在一些风险,比如说多个定时器的执行时间可能会出现重叠,导致程序出现不可预料的异常。

相反,使用setTimeout可以更加精确地控制定时器的执行。我们可以每次定时器执行完成后根据实际情况动态地调整下一次执行的时间,避免多个定时器出现重叠的情况。

下面,我们来具体分析一下如何使用setTimeout来实现定时任务。

示例1:用setTimeout模拟setInterval

假设我们需要每隔一段时间执行一次某个任务(比如说每100ms),我们可以使用一个循环的setTimeout来实现这个需求:

function doSomething() {
  console.log('Hello World!');
}

function interval() {
  setTimeout(interval, 100); // 再次设置定时器
  doSomething();
}

interval();

在上面的代码中,我们定义了一个doSomething函数表示要执行的任务,然后再定义了一个interval函数用来模拟setInterval的效果。

在interval函数中,首先通过setTimeout自身来设置下一次定时器的执行时间,然后再在当前时间执行doSomething函数即可。

示例2:使用setTimeout改善动画效果

使用setTimeout还有一个非常常见的应用场景,就是用来实现动画效果。

比如说我们需要实现一个数字滚动的效果,我们可以使用一个递归的setTimeout来动态地更新数字的值和显示效果,实现类似于滚动条的效果:

function scrollTo(target, value, duration) {
  let start = target.scrollTop;
  let end = value;
  let change = end - start;
  let startTime = new Date().getTime();

  function scroll() {
    let currentTime = new Date().getTime() - startTime;
    let val = Math.easeInOutQuad(currentTime, start, change, duration);
    target.scrollTop = val;

    if (currentTime < duration) {
      setTimeout(scroll, 1);
    }
  }

  scroll();
}

Math.easeInOutQuad = function (t, b, c, d) {
  t /= d / 2;
  if (t < 1) return c / 2 * t * t + b;
  t--;
  return -c / 2 * (t * (t - 2) - 1) + b;
};

在上面的代码中,我们定义了一个scrollTo函数用来实现数字滚动的效果。

首先我们通过一些数学计算和判断来确定更新数字过程中的具体数值,然后在scroll函数里面通过递归调用setTimeout来动态地更新数字的值和显示效果,直到达到指定的滚动时间。

总之,使用setTimeout可以帮助我们更为精确地控制定时器的执行,避免出现各种意外情况。同时,也可以通过设置递归调用的方式来实现循环和动画等多样化的需求。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈对于“不用setInterval,用setTimeout”的理解 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • Javascript中replace()小结

    当我们在Javascript中需要进行字符串的替换操作时,可以使用字符串内置的replace()方法。replace()方法接受两个参数,第一个参数是要替换的字符串或正则表达式,第二个参数是用于替换的新字符串。 下面是replace()的基本语法: string.replace(searchvalue, newvalue) 其中: searchvalue:要…

    JavaScript 2023年5月28日
    00
  • vue3使用vue-router及路由权限拦截方式

    让我为你讲解一下“vue3使用vue-router及路由权限拦截方式”的完整攻略。 1. 安装和配置vue-router 首先需要在项目中安装vue-router。 npm install vue-router 接下来在main.js中配置路由,并将其挂载到Vue实例上: import { createRouter, createWebHistory } f…

    JavaScript 2023年6月11日
    00
  • asp.net+js实现批量编码与解码的方法

    以下是“asp.net+js实现批量编码与解码的方法”的完整攻略。 一、背景 在一些网站开发中,可能会遇到需要对一些数据进行批量编码或者批量解码的需求。例如,对于一些包含特殊字符的字符串进行URL编码,或者将经过base64编码的数据进行解码等等。本篇攻略将介绍如何通过asp.net和javascript实现这些功能。 二、URL编码与解码 URL编码 在a…

    JavaScript 2023年5月19日
    00
  • JS 字符串连接[性能比较]

    下面是关于JS字符串连接的完整攻略: 什么是字符串连接? 字符串连接是指将多个字符串拼接成一个新的字符串的过程。在JS中,有多种方法可以进行字符串连接,比如用+运算符,使用模板字符串等。不同的方法会对性能造成不同的影响。 性能比较 String Concatenation性能测试显示,使用不同的方式进行字符串连接,性能会有很大的差别。 基于这个事实,我写了两…

    JavaScript 2023年5月28日
    00
  • javascript同步Import,同步调用外部js的方法

    JavaScript同步Import是一种将外部JavaScript文件同步导入到当前JavaScript文件中的方法。这种方法可以让外部JavaScript文件中的函数和变量永久地集成到当前JavaScript文件中。以下是使用该方法的完整攻略: 1. 创建一个外部的JavaScript文件 首先,您需要在与当前JavaScript文件相同的目录中创建一个…

    JavaScript 2023年6月11日
    00
  • JS和JQ的event对象区别分析

    JS和JQ都有一个event对象,但是它们的区别还是比较明显的。在这里我们来详细讲解一下。 1. JS的event对象 在JS中,事件触发时会自动生成一个event对象,并且通过addEventListener或者window.attachEvent绑定的函数,第一个参数都是event。event对象包含了一些事件的属性和方法,可以方便的获取事件的相关信息。…

    JavaScript 2023年6月10日
    00
  • 浅谈javascript中的 “ && ” 和 “ || ”

    浅谈JavaScript中的 “&&” 和 “||” 在JavaScript中,逻辑运算符包括“与”(&&)、“或”(||)及“非”(!)三种,其中“与”和“或”经常被用来作为条件判断语句中的关键字。本篇文章将会详细讲解“与”(&&)和“或”(||)这两个运算符的用法以及其常见应用场景。 “与”(&&a…

    JavaScript 2023年5月17日
    00
  • 最佳JS代码编写的14条技巧

    下面我将详细讲解“最佳JS代码编写的14条技巧”的完整攻略。 1. 使用语义化的命名 在编写JS代码时,我们应该尽可能使用语义化的命名,以便代码更加易读易懂。比如,在定义变量名时,应该尽量使用描述性的单词。 例如: let userName = ‘John Doe’; 这样命名,不仅可以让阅读者更快速地了解变量的意义,还可以让代码更具可读性。 2. 减少全局…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部