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之判断是否为对象或数组的几种方式总结

    JS中判断一个变量是否为对象或数组是开发过程中经常会用到的操作。可以使用以下几种方式进行判断: 1. typeof 操作符 typeof 操作符通常用来判断一个变量的类型,可以通过判断返回值是否是 “object” 来判断一个变量是否为对象。需要注意的是,也可以使用 typeof 判断一个数组,但是返回值是 “object”,所以需要进行额外的判断。 以下是…

    JavaScript 2023年5月27日
    00
  • javascript动画对象支持加速、减速、缓入、缓出的实现代码

    实现JavaScript动画对象支持加速、减速、缓入、缓出的过程基本分为以下几个步骤: 定义动画对象,设置初始值和目标值 设置动画的持续时间、缓动方式等参数 在动画前缓存当前状态 执行动画过程,不断更新当前状态 到达目标值后停止动画 下面详细介绍一下每个步骤 1. 定义动画对象 定义动画对象可以使用原生Javascript实现,例如: var element…

    JavaScript 2023年6月10日
    00
  • js如何打印object对象

    下面是关于如何打印JavaScript对象的攻略: 1. 使用console.log输出对象 在JavaScript中,可以使用console.log()方法来输出对象到控制台。这个方法可以接受一个或多个参数,并将它们以逗号分隔的形式打印到控制台。 示例代码: const obj = { name: ‘Alice’, age: 28 } console.lo…

    JavaScript 2023年5月27日
    00
  • 使用js正则表达式验证文件扩展名方法实例

    使用 JavaScript 正则表达式验证文件扩展名是一个常见的前端开发需求,下面是一份完整的攻略,供参考。 什么是文件扩展名? 在计算机领域,文件扩展名是指在文件名的末尾添加的一个或多个字符,用于表示该文件的类型。例如,“.txt” 表示文本文件,“.png” 表示图像文件,“.html” 表示网页文件等等。 验证文件扩展名的方法 在 JavaScript…

    JavaScript 2023年5月27日
    00
  • JavaScript将XML转成JSON的方法

    将XML转换为JSON是前端开发中的一个常见任务,可以使用JavaScript实现。以下是一种将XML转换为JSON的方法,步骤如下: 获取XML数据 首先,需要从服务器或API中获取XML数据。可以使用JavaScript中的XMLHttpRequest对象来实现。其中,XMLHttpRequest.open()方法设置HTTP请求的方法和URL,XMLH…

    JavaScript 2023年5月27日
    00
  • JavaScript弹出新窗口后向父窗口输出内容的方法

    下面是详细讲解“JavaScript弹出新窗口后向父窗口输出内容的方法”的完整攻略。 方法简介 在 JavaScript 中,我们可以通过打开一个新的窗口来向用户展示一些额外的内容或提供一些额外的功能,但在某些情况下,我们需要将这个新窗口的一些输出或处理结果返回到父窗口中。实现这个功能的方法有很多,下面介绍其中两种。 方法一:使用 window.opener…

    JavaScript 2023年5月28日
    00
  • 深入CSS3 动画效果的总结详解

    既然你要了解“深入CSS3 动画效果的总结详解”的完整攻略,我会给你详细的讲解。 深入CSS3 动画效果的总结详解 CSS3 是 CSS 技术的一个重要版本,它引入了很多新的功能和特性,其中包括强大的动画效果功能。CSS3 动画效果可以不需要 JavaScript 就能够实现各种各样的动画效果,并且使用非常灵活和方便。 下面给出一些深入 CSS3 动画效果的…

    JavaScript 2023年6月11日
    00
  • 收藏Javascript中常用的55个经典技巧

    收藏Javascript中常用的55个经典技巧 介绍 本文收集了Javascript中常用的55个经典技巧,每个技巧都包含简短的代码示例和详细的解释。这些技巧旨在帮助Javascript开发者提高他们的编程技能。 主要内容 以下是本文中包含的55个Javascript技巧: 数组去重 javascriptconst arr = [1, 2, 3, 3, 4,…

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