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

yizhihongxing

浅谈对于“不用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 array类 数组操作方法

    JavaScript 的 Array 类是经常被使用的一种数据类型,用于存储有序且可变长度的数据。为了更好的操作数组,JavaScript 提供了丰富的数组操作 API,包含创建、增加、删除、遍历和排序等方法。本文将介绍 JavaScript 的 Array 类的常用操作方法及其使用方法,内容如下: 创建数组 语法 new Array(); // 空数组 n…

    JavaScript 2023年6月10日
    00
  • JavaScript监听一个DOM元素大小变化

    要监听一个DOM元素大小的变化,我们可以利用JavaScript提供的IntersectionObserver API来实现。IntersectionObserver设计的初衷是为了监听页面中一个元素是否进入了视窗,但它也可以用于监听元素的大小变化。 以下是监听DOM元素大小变化的详细攻略: 步骤一:创建一个IntersectionObserver实例 首先…

    JavaScript 2023年6月10日
    00
  • Javascript Date getSeconds() 方法

    以下是关于JavaScript Date对象的getSeconds()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的getSeconds()方法 JavaScript Date对象的getSeconds()方法返回一个秒的数字(0-59)。方法可用获取当前日期的秒数。 下使用Date对象的getSeconds()方法的示例: var…

    JavaScript 2023年5月11日
    00
  • 在js代码拼接dom对象到页面上去的模板总结(必看)

    标题: 在JS代码拼接DOM对象到页面上的模板总结 在前端开发中,操作DOM节点是一个非常基础但又非常重要的任务。在JavaScript中,我们可以通过拼接DOM对象来实现动态渲染页面的目的,这种方式通常被称为“JS代码拼接DOM对象到页面上的模板”,本文将为您详细介绍该模板的使用方法和注意事项。 使用方法 对于JS代码拼接DOM对象到页面上,我们通常可以使…

    JavaScript 2023年6月10日
    00
  • Javascript中的arguments对象

    Javascript中的arguments对象 在Javascript中,函数参数可以通过arguments对象访问。这个对象是一个类数组对象,包含了函数调用时所有传入的实参,可以用来访问函数调用时没有在形参列表中声明的参数。 arguments对象的基本用法 arguments对象有如下属性和方法: 属性 callee: 返回当前正在执行的函数的引用,一般…

    JavaScript 2023年5月27日
    00
  • JavaScript简单计算人的年龄示例

    下面我会详细讲解如何实现“JavaScript简单计算人的年龄示例”,主要步骤如下: 第一步:获取出生年份 要计算一个人的年龄,首先我们需要获取他的出生年份。在JavaScript中,我们可以通过 prompt()函数获取用户在弹出的对话框中输入的信息。代码如下所示: let birthYear = prompt(‘请输入你的出生年份’); 这里用 let …

    JavaScript 2023年5月28日
    00
  • HTTP报文及ajax基础知识

    HTTP报文及AJAX基础知识 HTTP报文 HTTP报文的格式如下: <HTTP请求报文> <请求头> <请求体> <HTTP响应报文> <响应头> <响应体> 其中,请求头和响应头以键值对形式出现,每个键值对占一行,键和值之间使用一个冒号加一个空格隔开;请求体和响应体可以为空,也可以…

    JavaScript 2023年6月11日
    00
  • javascript 基础简介 适合新手学习

    JavaScript 基础简介 适合新手学习 JavaScript 是一种广泛应用于编写网页脚本的编程语言。学习 JavaScript 对于新手来说是一项基础工作,本文章为新手介绍 JavaScript 的基础语法、数据类型、流程控制以及实例应用。 JavaScript 基础语法 JavaScript 代码可嵌入 HTML 页面的 \ 标签中。有两种方式,一…

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