浅谈JavaScript节流和防抖函数

yizhihongxing

浅谈JavaScript节流和防抖函数

前言

在前端开发中,我们经常会遇到需要监听用户操作并执行相应任务的情况,例如用户在搜索框中输入关键词时,会实时通过ajax请求获取匹配结果;用户在滚动页面时,会自动加载更多的内容等等。但是由于用户的操作往往不可预测,当用户频繁进行操作时,会导致一些性能问题,如频繁地发送请求,重复执行相同的逻辑等等。这时候,就需要用到节流和防抖函数来限制这种不必要的操作。

节流函数(throttle)

节流函数是指在一段时间内,只执行一次事件。它可以避免一些高频率调用的事件,使其被间隔执行。常见的节流函数有时间戳版本和定时器版本。时间戳版本即指在固定时间内执行一次时间函数,而定时器版本则是在固定时间后执行一次事件。

以定时器版本为例,其基本模板代码为:

function throttle(func, delay) {
  let canRun = true;
  return function() {
    if (!canRun) return;
    canRun = false;
    setTimeout(() => {
      func.call(this, ...arguments);
      canRun = true;
    }, delay);
  };
}

在上述代码中,canRun表示此时函数能否执行的标志,在未达到规定时间时,其为false,在达到规定时间后,其变为true,以便下一次可以执行函数。在函数执行前将canRun标记为false,并将当次执行函数的参数延迟到delay后才执行。 这才是节流执行的精髓所在。

接下来,我们来看一个实例,通过点击一次按钮打印当前时间,并且确保在一定时间间隔内只执行一次。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>throttle示例</title>
  </head>
  <body>
    <button id="btn">点击弹出当前时间</button>
    <script>
      function throttle(func, delay) {
        let canRun = true;
        return function () {
          if (!canRun) return;
          canRun = false;
          setTimeout(() => {
            func.call(this, ...arguments);
            canRun = true;
          }, delay);
        };
      }
      let clickHandler = throttle(function () {
        console.log(new Date().toLocaleTimeString());
      }, 1000);
      document.getElementById('btn').addEventListener('click', clickHandler);
    </script>
  </body>
</html>

在上述示例中,当我们点击按钮后,函数会在1秒后输出当前时间,即使我们快速点击多次,也只会在1秒后输出最后一次操作的时间。

防抖函数(debounce)

防抖函数也是用于避免函数的重复执行,但是相比节流函数,它是在每次事件结束后规定时间再执行事件,而不是固定时间内只执行一次事件。这样,在函数执行后,如果用户继续操作,则计时器被清空,重新规定事件。

以定时器版本为例,其基本模板代码为:

function debounce(func, delay) {
  let timer = null;
  return function () {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.call(this,...arguments);
    },delay);
  };
}

在上述代码中,timer表示setTimeout函数的返回值,在每次函数执行前清除上次setTimeout事件,调用最新的setTimeout事件来执行新的函数。调用方法如下:

let debouncedFunc = debounce(function () {
  console.log(new Date().toLocaleTimeString());
}, 1000);

接下来,我们来看一个实例,限制滚动事件每500ms触发一次:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>debounce示例</title>
  </head>
  <body>
    <div style="height: 2000px"></div>
    <script>
      function debounce(func, delay) {
        let timer = null;
        return function () {
          clearTimeout(timer);
          timer = setTimeout(() => {
            func.call(this, ...arguments);
          }, delay);
        };
      }
      window.onscroll = debounce(function () {
        console.log(new Date().toLocaleTimeString());
      }, 500);
    </script>
  </body>
</html>

在上述示例中,当我们滚动页面时,函数会在500毫秒后输出当前时间,如果在500ms内连续滚动,只会在最后一次滚动结束后500ms输出时间。

总结

节流和防抖函数虽然在代码结构上十分相似,但是还是有一些区别的。防抖函数是在一定时间后执行事件,进行了时间避免错误,而节流函数则是规定在特定时间内只执行一次事件。在实际开发中,需要根据具体情况选择节流函数或防抖函数进行优化,从而减少对性能的影响。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈JavaScript节流和防抖函数 - Python技术站

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

相关文章

  • 基于JavaScript创建动态Dom

    创建动态 DOM 可以通过多种方式,其中一种方法是使用 JavaScript。下面是基于 JavaScript 创建动态 DOM 的完整攻略,包含两条示例说明。 1. 在 HTML 中创建容器元素 首先,在 HTML 页面中创建一个空的容器元素,该元素的 id 属性可以用于后续操作。例如: <!DOCTYPE html> <html>…

    JavaScript 2023年5月28日
    00
  • JavaScript正则表达式和级联效果

    JavaScript正则表达式是一种强大的文本处理工具,可以帮助我们快速查找、替换并验证字符串。级联效果是指在表单中使用多个输入框时,前后输入框的内容之间会有一定的联系和限制。下面是JavaScript正则表达式和级联效果的详细攻略。 JavaScript正则表达式 什么是正则表达式 正则表达式即为RegExp对象,通过正则表达式可以匹配字符串并且进行替换。…

    JavaScript 2023年6月10日
    00
  • js中取得变量绝对值的方法

    当我们需要在 JavaScript 中获取一个变量的绝对值时,可以使用 Math 对象的 abs() 方法。下面是详细的攻略: 使用 Math.abs() 方法获取变量的绝对值 Math 对象是 JavaScript 提供的一个内置对象,通过该对象提供的 abs() 方法,即可获取任意数字类型的变量的绝对值。 let num1 = -5, num2 = 10…

    JavaScript 2023年5月28日
    00
  • JavaScript File API文件上传预览

    下面是关于“JavaScript File API文件上传预览”的完整攻略。 什么是JavaScript File API文件上传预览? JavaScript File API 文件上传预览是浏览器API之一,主要用于在浏览器中的上传文件操作中,可以通过JavaScript获取文件内容并展示到网页上,给用户更加直观的展示效果。 实现文件上传预览的步骤 1. …

    JavaScript 2023年5月27日
    00
  • 学习LayUI时自研的表单参数校验框架案例分析

    下面是“学习LayUI时自研的表单参数校验框架案例分析”的完整攻略: 学习LayUI时自研的表单参数校验框架案例分析 前言 LayUI是一款基于jQuery的UI库,广泛应用于前端开发中。其提供了丰富的组件和插件,方便快捷地构建Web界面。在使用LayUI过程中,表单参数校验是绕不过去的一个步骤,为此我们研发了一套表单校验框架,下面将详细介绍我们的研发过程和…

    JavaScript 2023年6月10日
    00
  • 仿3721首页模块拖曳移动效果js代码[可拖曳层移动层]

    “仿3721首页模块拖曳移动效果js代码[可拖曳层移动层]”是一种常见的网页可交互功能,下面我将详细讲解如何实现该功能的完整攻略: 1. 准备工作 在实现拖曳移动效果前,我们需要准备一些基础的工作: 1.在 HTML 文件中添加需要被拖曳的标签 2.使用 CSS 设置被拖曳标签的默认样式 3.导入拖曳移动所需的 JavaScript 库 2. 实现拖曳移动效…

    JavaScript 2023年6月11日
    00
  • js倒计时简单实现代码

    下面是“js倒计时简单实现代码”的完整攻略: 一、分析倒计时的实现原理 倒计时的实现原理是通过获取当前时间和目标时间之间的差值,然后将差值转换为天、时、分、秒等具体的时间单位,最后通过将时间单位显示在页面上达到倒计时的效果。 二、实现步骤 在html页面中创建一个计时器的容器,并在容器中添加显示天、时、分、秒的元素。 <div id="tim…

    JavaScript 2023年6月11日
    00
  • JS弹出窗口代码大全(详细整理)

    针对JS弹出窗口代码大全(详细整理)这篇攻略,我来详细讲解一下。 1. 标题分析 在这篇攻略中,首先我们可以看到一个一级标题——JS弹出窗口代码大全(详细整理)。根据标题中的关键词,我们可以猜测到这篇攻略将会介绍一些JS弹出窗口的实现代码,并且可能是一个包含多篇文章的系列攻略。 2. 掌握目录结构 接下来,我们可以看到一个二级标题——目录。在这个二级标题下,…

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