JavaScript 防抖debounce与节流thorttle

JavaScript 防抖 debounce 与节流 throttle

在 JavaScript 中,由于一些操作会频繁触发,如缩放、滚动等,可能会造成一些性能上的问题。而防抖和节流是一些用于解决这类问题的优化手段。

防抖 debounce

所谓防抖,就是指一个函数在一定时间内无论被触发多少次,都只会执行一次。这里的时间指的就是防抖的延迟时间,只有当该时间结束后,函数才会被执行一次。

下面是一段防抖的示例代码:

/**
 * 防抖函数
 * @param {Function} func 需要执行的函数
 * @param {number} delay 延迟执行的时间(单位:毫秒)
 * @returns {Function} 返回防抖处理后的函数
 */
function debounce(func, delay) {
  let timer = null;

  return function() {
    const context = this;
    const args = arguments;

    if (timer) clearTimeout(timer);

    timer = setTimeout(() => {
      func.apply(context, args);
    }, delay);
  }
}

/**
 * 使用示例
 */
function doSomething() {
  console.log('do something');
}

const debouncedDoSomething = debounce(doSomething, 1000);

window.addEventListener('scroll', debouncedDoSomething);

这段代码中,我们定义了一个 debounce 函数,它将需要执行的函数和延迟执行的时间作为参数。在函数内部,我们创建了一个 timer 变量,用于存放 setTimeout 返回的定时器 ID。在执行函数时,我们首先保存当前执行上下文和参数,如果 timer 已存在,则清除它。然后使用 setTimeout 创建一个定时器,在指定的延迟时间后执行函数。

在使用时,我们可以将需要执行的函数和防抖延迟时间作为参数传入 debounce 函数,得到一个新的防抖处理过的函数。在这里,我们给 window 对象的 scroll 事件监听函数传入了这个新的防抖函数,以实现防抖的效果。

节流 throttle

与防抖不同,节流是指一个函数在一定时间内最多只能执行一次。这里的时间指的是节流的间隔时间,只有当该时间过去后,函数才会被执行。

下面是一段节流的示例代码:

/**
 * 节流函数
 * @param {Function} func 需要执行的函数
 * @param {number} interval 最小间隔时间(单位:毫秒)
 * @returns {Function} 返回节流处理后的函数
 */
function throttle(func, interval) {
  let timer = null;
  let lastExecTime = 0;

  return function() {
    const context = this;
    const args = arguments;
    const elapsed = Date.now() - lastExecTime;

    if (elapsed < interval) {
      if (timer) clearTimeout(timer);
      timer = setTimeout(() => {
        lastExecTime = Date.now();
        func.apply(context, args);
      }, interval - elapsed);
    } else {
      lastExecTime = Date.now();
      func.apply(context, args);
    }
  }
}

/**
 * 使用示例
 */
function doSomething() {
  console.log('do something');
}

const throttledDoSomething = throttle(doSomething, 1000);

window.addEventListener('scroll', throttledDoSomething);

这段代码中,我们定义了一个 throttle 函数,将需要执行的函数和最小间隔时间作为参数。在函数内部,我们定义了一个 timer 变量,用于存放 setTimeout 返回的定时器 ID,以及一个 lastExecTime 变量,记录上次执行的时间。在执行函数时,我们首先保存当前执行上下文和参数,计算当前时间与上次执行时间的间隔,如果间隔还没达到最小间隔时间,则使用 setTimeout 创建一个定时器,在这个定时器超时时执行函数;如果间隔已经达到最小间隔时间,则直接执行函数,并更新 lastExecTime 的值。

在使用时,我们可以将需要执行的函数和节流时间间隔作为参数传入 throttle 函数,得到一个新的节流处理过的函数。在这里,我们给 window 对象的 scroll 事件监听函数传入了这个新的节流函数,以实现节流的效果。

防抖与节流的选择

防抖与节流都是解决事件触发频繁引起性能问题的优化手段,在不同的应用场景下可能会有不同的选择。

防抖的应用场景:

  • 按钮提交场景:防止多次提交按钮,只执行最后提交的一次
  • 搜索框场景:防止搜索连续触发,只在搜索结束后执行一次
  • 监听滚动事件:防止滚动连续触发,只在隔一段时间后执行一次

节流的应用场景:

  • 滚动加载场景:滚动时,不断加载数据,但是要控制两次请求之间的时间间隔,防止一次滚动中请求次数过多
  • 统计埋点场景:多次点击进行统计时,需要控制一段时间才能进行下一次统计

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

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

相关文章

  • js中class的点击事件没有效果的解决方法

    问题描述: 在JavaScript中使用class定义的元素,如果带有点击事件绑定,在点击时有可能不起作用,导致点击事件无法触发。 解决方法: 使用事件代理 事件代理是将处理事件的职责委托给父元素,由父元素处理所有子元素的事件。在这种情况下,即使是通过JavaScript操作添加的元素也能够正确地触发点击事件。 使用addEventListener方法为父元…

    JavaScript 2023年6月10日
    00
  • Vue Element前端应用开发之echarts图表

    让我来为你分享一下“Vue Element前端应用开发之echarts图表”的完整攻略。 一、背景介绍 在现代化的前端应用开发中,图表展示是一个非常重要的功能。而echarts作为一种非常强大的数据可视化库,广泛应用于各种Web应用的开发,成为了前端数据可视化的重要工具。本文将通过Vue Element前端应用开发来讲解如何使用echarts实现图表的展示。…

    JavaScript 2023年6月10日
    00
  • bootstrap日期插件daterangepicker使用详解

    Bootstrap日期插件daterangepicker使用详解 介绍 Daterangepicker是一个Bootstrap风格的日期范围选择器插件。它可以让用户直接在页面上快速选择时间段,而不需要手动输入。它可以与Moment.js和jQuery结合起来使用。本篇攻略将介绍如何使用Daterangepicker插件进行日期范围选择。 步骤 1.获取插件 …

    JavaScript 2023年6月10日
    00
  • JavaScript 数组基本操作全解

    JavaScript 数组基本操作全解 什么是 JavaScript 数组? JavaScript 数组是存储值的有序集合。它可以存储任何类型的值,例如数字、字符串和对象。 数组的每个元素都有一个数字索引,用于访问数组中的元素。 如何创建 JavaScript 数组? 可以使用以下两种方式创建 JavaScript 数组: 1.直接赋值 let fruits…

    JavaScript 2023年5月18日
    00
  • 分享一个自己写的简单的javascript分页组件

    下面我来详细讲解如何分享一个自己写的简单的 JavaScript 分页组件,并且提供两条示例说明。 前置知识 在开始分享 JavaScript 分页组件之前,需要掌握一些基本的前置知识,如 HTML、CSS 和 JavaScript 的基本语法和概念。同时,也需要了解一些相关的知识,比如 DOM 操作、事件监听、Ajax 等。 分享步骤 分享一个 JavaS…

    JavaScript 2023年6月11日
    00
  • JavaScript变量声明var,let.const及区别浅析

    JavaScript变量声明var,let,const及区别浅析 在JavaScript中,我们可以使用 var,let 和 const 关键字来声明变量,但这些关键字的用法和区别是比较容易混淆的。本文将对这三种关键字进行详细讲解。 var 在ES6之前,JavaScript中只有 var 这一个声明变量的关键字。var 关键字声明的变量作用域是函数级别的。…

    JavaScript 2023年6月10日
    00
  • Javascript图像处理—为矩阵添加常用方法

    Javascript 图像处理 – 为矩阵添加常用方法 前言 在图像处理中,矩阵是重要的数据结构。Javascript 作为一门强大的编程语言,可以非常方便地完成矩阵的各种操作。在本篇文章中,我们将讲解为矩阵添加一些常用方法的过程,以便于以后的图像处理中使用。 实现常用矩阵方法 为了方便起见,我们在这里定义一个矩阵的类: class Matrix { con…

    JavaScript 2023年6月11日
    00
  • 20行js代码实现的贪吃蛇小游戏

    20行js代码实现的贪吃蛇小游戏攻略 1. 实现思路 该贪吃蛇小游戏的实现思路非常简单,主要分为以下两步: 初始化游戏BOSS。 在游戏中添加监听事件,监听玩家的操作,并处理游戏逻辑。 2. 代码实现 游戏的实现代码如下: with(document){ a = appendChild(createElement("canvas")).g…

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