javascript函数的节流[throttle]与防抖[debounce]

yizhihongxing

JavaScript函数的节流与防抖

javascript开发中,有时候我们需要在频繁触发某些事件时,进行性能优化,防止事件处理函数被频繁调用而导致页面出现性能问题,这时,javascript的节流和防抖技术就能派上用场了。

什么是节流

节流(throttle)是一种控制事件触发频率的技术,它会将一定时间内发生的多次事件,限制成只触发一次事件。

具体来说,throttle会设置一个时间间隔threshold,在该时间间隔内,如果事件被重复触发,throttle会忽略多余的事件触发。只有当该时间间隔threshold到达之后,才会触发一次已忽略的事件,并重置定时器。

下面是一个基于定时器实现的节流函数示例代码:

function throttle(fn, interval) {
  let timer = null;
  return function (...args) {
    if (!timer) {
      timer = setTimeout(() => {
        fn.apply(this, args);
        timer = null;
      }, interval);
    }
  };
}

上述代码中的throttle函数,接受两个参数:一个是事件处理函数(fn),另一个是时间间隔(interval)。当事件被触发时,throttle将fn函数包装成一个闭包,然后利用setTimeout函数来延迟事件处理函数的执行,达到节流的目的。

什么是防抖

防抖(debounce)是一种控制事件触发频率的技术,它会将多次事件的执行合并成一次事件,并在一定时间后执行一次。

具体来说,debounce会设置一个时间间隔threshold,在该时间间隔内,如果事件被重复触发,debounce会忽略之前的事件触发,并在时间间隔到达后,才会执行一次已经合并的事件。

下面是一个基于定时器实现的防抖函数示例代码:

function debounce(fn, interval) {
  let timer = null;
  return function (...args) {
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    timer = setTimeout(() => {
      fn.apply(this, args);
      timer = null;
    }, interval);
  };
}

上述代码中的debounce函数,接受两个参数:一个是事件处理函数(fn),另一个是时间间隔(interval)。当事件被触发时,debounce会清除之前的定时器,并重新设置一个新的定时器。在给定的时间间隔(interval)内,如果事件持续触发,则会重新设置定时器。当时间间隔到达后,会执行fn函数。

节流和防抖的应用场景

  • 节流时间间隔太短,适用于一些比较频繁的操作,比如实时搜索
  • 防抖时间间隔太短,适用于一些不太频繁的操作,比如表单验证

以下分别是一个简单的处理鼠标移动事件的节流和防抖示例:

节流示例

// 实时显示鼠标移动的坐标
const displayPositionThrottle = throttle((e) => {
  console.log(e.clientX, e.clientY);
}, 1000);

document.addEventListener('mousemove', displayPositionThrottle);

上述代码会持续监测鼠标移动事件,但只会在1秒内执行一次事件处理,避免了频繁改动DOM造成的页面性能问题。

防抖示例

// 点击按钮提交表单
const button = document.querySelector('button');
const submitFormDebounce = debounce(() => {
  console.log('提交表单');
}, 1000);

button.addEventListener('click', submitFormDebounce);

上述代码会在点击按钮时执行表单提交的操作,但如果一直频繁点击按钮,则不会一直发起表单提交操作,而是在1秒后执行一次提交表单操作,避免了因频繁点击按钮而造成的表单重复提交问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javascript函数的节流[throttle]与防抖[debounce] - Python技术站

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

相关文章

  • JS基于正则实现数字千分位用逗号分隔的方法

    下面是JS基于正则实现数字千分位用逗号分隔的方法的完整攻略。 什么是数字千分位? 在很多情况下,我们需要将数字的千位用逗号分隔,比如说 1000,我们需要显示为 1,000,这样更易于辨认和阅读。 实现方法 在 JavaScript 中,可以使用正则表达式来实现数字千分位的处理。以下是具体实现步骤: 步骤一:将数字转换为字符串 首先,我们要将需要处理的数字转…

    JavaScript 2023年5月28日
    00
  • JavaScript前端面试组合函数

    JavaScript前端面试中,组合函数是一个常见的考点,如果能够掌握组合函数的概念、实现及应用,能够极大地提高我们面试的成功率。本篇文章将会详细讲解“组合函数”的相关知识点,并提供两个示例来进行说明。 什么是组合函数 组合函数指的是将多个函数组合成一个新的函数,新函数会按照一定的顺序调用这些子函数,并将每个子函数的返回值作为参数传递给下一个函数。组合函数可…

    JavaScript 2023年5月27日
    00
  • asp javascript 实现关闭窗口时保存数据的办法

    下面是“asp javascript 实现关闭窗口时保存数据的办法”的完整攻略: 1. 使用 onbeforeunload 事件 onbeforeunload 事件可以在页面关闭之前触发,我们可以在这个事件中实现数据保存的逻辑。具体实现步骤如下: 在页面中添加 <body onbeforeunload=”return onBeforeUnloadHan…

    JavaScript 2023年6月11日
    00
  • 详解js正则表达式语法介绍

    详解js正则表达式语法介绍 什么是正则表达式 正则表达式是一种强大的文本匹配工具,它可以根据特定的符号和语法定义来描述和匹配文本中某个部分的规律。 在js中,我们可以通过RegExp对象来创建正则表达式,或者直接使用正则表达式字面量(使用斜杠包围)。 正则表达式语法介绍 基本语法 正则表达式由两部分组成:模式和标志。模式是我们想要匹配的文本规律,标志则是对模…

    JavaScript 2023年6月10日
    00
  • Javascript NaN 属性

    以下是关于JavaScript NaN属性的完整攻略。 JavaScript NaN属性 JavaScript NaN属性是全局对象的一个属性,它表示“Not a Number”,不是数字。当一个值无法被解析为数字时,就返回NaN。NaN是一个特殊的数字值,它与任何其他值都不相等,包括它自己。 下面是一个使用NaN属性的示例: console.log(NaN…

    JavaScript 2023年5月11日
    00
  • Javascript创建类和对象详解

    Javascript创建类和对象详解 在Javascript中,我们可以使用构造函数和原型对象的方式来创建类和对象。 构造函数 构造函数是一个普通的函数,用于初始化一个对象。在使用new运算符生成一个对象时,会自动创建一个空对象,并将该对象传递到构造函数中,最终返回这个对象。构造函数的命名规则是约定俗成的首字母大写。 示例1 function Person(…

    JavaScript 2023年5月27日
    00
  • JS中判断某个字符串是否包含另一个字符串的五种方法

    下面我会给您详细讲解JS中判断某个字符串是否包含另一个字符串的五种方法,并提供相应代码示例进行说明。 方法一:使用indexOf indexOf函数在判断字符串包含的时候是最常用的方法之一,它返回的值为所查找的字符串首次出现的位置,如果没有找到则返回-1。 let str1 = "hello world"; let str2 = &quo…

    JavaScript 2023年5月28日
    00
  • JavaScript Reduce使用详解

    JavaScript Reduce使用详解 在JavaScript中,数组的reduce方法可以让我们使用自定义的函数将数组中的所有元素汇总为一个值,该值既可以是一个数字,也可以是一个对象或数组。 reduce方法的语法 reduce方法的语法如下: array.reduce(callback[, initialValue]) 其中,参数callback为一…

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