JavaScript 防抖debounce与节流thorttle

yizhihongxing

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日

相关文章

  • javascript日期验证之输入日期大于等于当前日期

    针对“javascript日期验证之输入日期大于等于当前日期”这个问题,我们可以采用如下的步骤进行处理: 步骤一:获取用户输入的日期并与当前日期进行比较 我们可以使用Date对象来获取当前日期,然后将用户输入的日期与其进行比较,判断用户输入的日期是否大于等于当前日期。代码如下: // 获取当前日期 var currentDate = new Date(); …

    JavaScript 2023年6月10日
    00
  • JavaScript 判断日期格式是否正确的实现代码

    判断日期格式是否正确的实现代码需要考虑不同的日期格式,包括年月日、小时分钟秒、毫秒等不同的时间单位组合,不同的时间分隔符等因素。下面就是一份基于JavaScript的日期格式验证实例代码。 步骤1:定义正则表达式 为了实现日期格式验证,我们需要使用正则表达式来判断是否满足指定日期格式。以下是一个匹配日期格式的正则表达式。 const dateRegEx = …

    JavaScript 2023年5月27日
    00
  • JS将时间秒转换成天小时分钟秒的字符串

    要将时间秒转换成天小时分钟秒的字符串,可以分别计算出总共的天数、小时数、分钟数和剩余的秒数,并将其拼接成字符串。 下面是一条完整的攻略: 步骤1:计算总共的天数 首先,我们可以将总的时间秒转换成天数,可以使用以下公式: var day = Math.floor(seconds / (3600 * 24)); 这里使用了 Math.floor() 方法来将结果…

    JavaScript 2023年5月27日
    00
  • document.getElementById的一些细节

    当我们在JavaScript中使用DOM操作时,document.getElementById方法是最基本且常用的方法之一,主要用于通过元素的ID获取该元素对象。 下面是一些document.getElementById的细节: 获取不存在的ID时返回null 当我们使用document.getElementById获取ID并且此ID不存在的时候,该方法会返…

    JavaScript 2023年6月10日
    00
  • javascript实现的动态添加表单元素input,button等(appendChild)

    JavaScript中使用appendChild()方法可以动态添加HTML元素。该方法可以将新建的元素节点添加到指定父级节点的最后一个子节点后面。以下是详细的攻略: 步骤 首先需要获取到需要添加元素的父节点对象,可以使用document.getElementById()方法或其它方法获取。 创建需要添加的元素节点对象,例如创建一个input元素节点,可以使…

    JavaScript 2023年6月10日
    00
  • JavaScript函数及其prototype详解

    标题:JavaScript函数及其prototype详解 1. 函数基础知识 JavaScript中的函数是一等公民,也是最重要的核心语言特性之一。函数有以下定义形式: function functionName(arguments){ //函数体 return returnValue; } 其中,functionName是函数名,arguments是函数的…

    JavaScript 2023年5月18日
    00
  • javascript自定义函数参数传递为字符串格式

    当定义一个自定义函数时,我们可以定义该函数拥有的参数列表。这些参数可以是任何类型的,如字符串、数字、布尔值、数组和对象等。当我们调用这个函数时,我们必须传递与函数定义中声明的参数类型相匹配的参数。下面是关于如何将字符串格式作为函数参数传递的完整攻略。 1. 将字符串作为函数的参数 我们可以将字符串值作为自定义函数的参数,这个字符串可以是任何东西,例如一个句子…

    JavaScript 2023年5月28日
    00
  • 详解JavaScript的定时器

    下面是详解JavaScript的定时器的完整攻略: 什么是JavaScript定时器 JavaScript定时器是用来控制代码在指定的时间间隔内执行的方法。它们是非常有用的,可以用于制作动画、轮播图、定时更新时间等。JavaScript中有两种类型的定时器:setInterval()和setTimeout()。 setInterval() setInterv…

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