浅谈JavaScript节流和防抖函数

浅谈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中数组去除重复的三种方法

    以下是“JavaScript中数组去除重复的三种方法”的完整攻略。 方法一:使用双重循环 算法思路 使用一个外层循环遍历数组元素,然后在外层循环内部再嵌套一个内层循环遍历前面的元素,依次与当前元素比较,如果有相同的就将其删除。 代码示例 function unique1(arr) { for (var i = 0; i < arr.length; i+…

    JavaScript 2023年5月27日
    00
  • TypeScript 数组Array操作的常用方法

    TypeScript 数组Array是一种常用的数据结构,它可以用来存储一系列可变的数据。在实际开发中,我们经常需要对数组进行操作,如添加、删除、修改,排序等。下面是对 TypeScript 数组Array操作的常用方法的完整攻略: 创建数组 要创建一个数组,你可以使用以下方法: let myArray: string[] = []; let myArray…

    JavaScript 2023年5月27日
    00
  • 基于Jquery实现表单验证

    下面是“基于Jquery实现表单验证”的完整攻略: 一、引入JQuery 我们需要先在HTML页面中引入JQuery,代码如下所示: <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> 二、实现基础…

    JavaScript 2023年6月10日
    00
  • JS入门代码集合第2/4页

    关于“JS入门代码集合第2/4页”的完整攻略,我会步步为营地进行说明。 标题 首先,我们需要规范文章的结构,例如使用不同级别的标题来划分不同的段落。在这里,我们可以使用一、二级标题,例如: JS入门代码集合第2/4页完整攻略 一级标题示例 二级标题示例 代码块 其次,在讲解JS代码之前,我们需要知道如何展示JS代码。这里我们可以使用代码块,例如: conso…

    JavaScript 2023年5月17日
    00
  • JS产生随机数的用法小结

    JS产生随机数的用法小结 在JavaScript中,我们可以使用Math对象的random()方法来产生随机数。random()方法返回一个0到1之间(包括0但不包括1)的随机数。我们可以通过一些数学计算来获得我们需要的随机数。 产生一定范围内的随机整数 我们可以使用下面这个公式来产生一个在指定范围内的随机整数: Math.floor(Math.random…

    JavaScript 2023年5月28日
    00
  • 浅谈javascript中onbeforeunload与onunload事件

    当用户即将关闭页面或者离开当前页面时,JavaScript中提供了两个常见的事件:onbeforeunload和onunload。 onbeforeunload事件 onbeforeunload事件会在页面关闭或者刷新之前触发,它可以用来提示用户保存数据或者进行其他的操作。这个事件触发后,浏览器会弹出一个确认对话框,询问用户是否确定要离开当前页面。 以下是o…

    JavaScript 2023年6月11日
    00
  • Javascript 函数中的参数使用分析

    下面是关于“JavaScript 函数中的参数使用分析”的攻略。 函数中参数的基本用法 在 JavaScript 函数中,参数是指在函数定义中列出的变量名称。当调用函数时,传递给函数的值是参数值。在函数内部,参数扮演着变量的角色,通过它们我们可以得到调用函数的值。以下是一个简单的函数定义示例: function greet(name) { console.l…

    JavaScript 2023年5月27日
    00
  • Vue3 Element Plus el-form表单组件示例详解

    下面是“Vue3 Element Plus el-form表单组件示例详解”的完整攻略: 1. 简介 Vue3 Element Plus是一套基于Vue 3和Element Plus组件库的前端解决方案。它提供了丰富的UI组件和工具,用于开发高质量的Web应用程序。 其中,el-form表单组件是Element Plus中的一个常用组件之一,用于收集和验证用…

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