浅谈对于“不用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日

相关文章

  • ajax实现简单实时验证功能

    下面是“ajax实现简单实时验证功能”的攻略: 什么是Ajax实时验证 Ajax是一种用于创建快速动态Web网页的技术,通过在不刷新页面的情况下向服务器发送请求并获取响应数据,可以实现实时验证表单数据的功能。 通常在前端验证数据的时候,我们会通过JavaScript来实现,但是客户端验证容易被用户绕过,所以我们还需要在后端进行验证。而利用Ajax可以在前端先…

    JavaScript 2023年6月10日
    00
  • javascript结合Cookies实现浏览记录历史第1/3页

    对于“javascript结合Cookies实现浏览记录历史第1/3页”的完整攻略,以下为具体步骤: 1. 添加Cookie操作函数 在JavaScript中,需要先定义一些操作Cookie的函数。下面是一个可以添加、获取和删除Cookie的示例代码: // 添加Cookie function setCookie(name, value, expires) …

    JavaScript 2023年6月11日
    00
  • tree shaking对打包体积优化及作用

    什么是Tree Shaking Tree Shaking 是指在打包过程中,检测出未被引用的代码,并在最终打包结果中将这些未引用的代码(也被称为“未引用代码(dead code)”)移除。Tree Shaking 目的是为了精简打包后的代码和减小文件体积,提升网页加载速度。 在理解 Tree Shaking 之前需要了解几个概念:- 模块 (Module):…

    JavaScript 2023年6月11日
    00
  • JavaScript 中的无穷数(Infinity)详解

    那么首先需要明确的是,在 JavaScript 中,Infinity 是指表示正无穷大的数字常量。它比任何数都大,包括自身。同时,JavaScript 也提供了一个负无穷大的常量,即-Infinity。下面,我将会详细讲解 Infinity 在 JavaScript 中的应用及示例。 什么是 Infinity? Infinity 是一个 JavaScript…

    JavaScript 2023年5月27日
    00
  • php用正则表达式匹配中文实例详解

    下面我将详细讲解“php用正则表达式匹配中文实例详解”的完整攻略,包括以下几个方面: 正则表达式匹配中文的原理 常用的正则表达式匹配中文的方法 示例 1. 正则表达式匹配中文的原理 正则表达式是由一些字符和特殊字符组成的字符串,它可以用于对字符串进行模式匹配和查找等操作。在PHP中,可以使用正则表达式来匹配中文。 中文是Unicode字符集中的一种字符,其编…

    JavaScript 2023年5月19日
    00
  • JavaScript的防抖和节流案例

    JavaScript的防抖和节流是常用的优化技巧,可以有效地控制函数的执行频率,提升Web页面的性能和用户体验。本文将从原理、使用场景,以及基于两个实际案例的讲解,逐步深入介绍JavaScript的防抖和节流优化技巧。 一、防抖和节流的原理 防抖和节流的本质都是控制函数的执行频率,从而提升Web页面的性能。他们的实现方式不同,具体如下: 1. 防抖 防抖的原…

    JavaScript 2023年6月10日
    00
  • 微信小程序 教程之事件

    以下是关于“微信小程序教程之事件”的详细攻略: 什么是小程序事件 微信小程序中,我们可以使用事件来监听用户的操作,并根据用户操作来触发我们程序中的相应的行为。小程序中常见的一些事件如下: touchstart、touchmove、touchend:触摸事件,可以监听用户触摸屏幕的动作; tap、longpress、longtap:点击事件,可以监听用户单击、…

    JavaScript 2023年6月11日
    00
  • javascript学习笔记(四)function函数部分

    下面是JavaScript学习笔记(四)Function函数部分的完整攻略。 一、函数的定义 JavaScript中的函数使用function关键字来定义,函数中的代码块可以在任何时间被调用多次。函数可以带着参数来进行运算,也可以返回值(有时不返回值,而是引起副作用)。 1. 基本语法 function functionName(parameters){ /…

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