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

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常见内存泄漏及解决方案解析 在JavaScript中,内存泄漏是常见的问题之一。当我们创建对象时,Javascript引擎通过自动垃圾回收机制自动处理内存,但如果我们在编写代码时犯了一些错误,就可能会导致内存泄漏。本文将探讨JS常见的内存泄漏问题及解决方案。 什么是内存泄漏? 内存泄漏是指由于被分配的内存没有被及时释放,导致系统内存耗尽或程序性能下降。在…

    JavaScript 2023年6月10日
    00
  • Vue.js 2.0学习教程之从基础到组件详解

    首先,本文将介绍一份针对Vue.js 2.0的学习教程,包括从基础开始,逐步介绍Vue.js的概念和用法,最终深入到Vue.js组件的详细讲解。 一、Vue.js基础 1.1 Vue.js的基本概念和语法 在Vue.js中,最核心的概念是“响应式”,通过将对象代理到Vue实例上,使得当对象改变时,Vue实例能够监听到并动态更新相应的视图。另外,Vue.js还…

    JavaScript 2023年6月10日
    00
  • C#后台调用前台javascript的五种方法小结

    下面是详细讲解“C#后台调用前台javascript的五种方法小结”的完整攻略。 简介 在Web开发中,经常会需要在C#后台中调用前台的JavaScript函数,实现前后台数据的交互。本篇文章将介绍五种方法,分别是: RegisterClientScriptBlock:在页面中注册客户端脚本代码块; RegisterStartupScript:在页面中注册客…

    JavaScript 2023年5月27日
    00
  • 前端使用JSON.stringify实现深拷贝的巨坑详解

    首先,需要明确深拷贝和浅拷贝的概念。 在JavaScript中,对象的赋值有两种方式:深拷贝和浅拷贝。浅拷贝只是将对象的引用复制给了新的变量,而深拷贝则是递归地复制对象及所有嵌套的子对象。 JSON.stringify可以将一个JavaScript对象序列化成一个JSON字符串,而JSON.parse则可以将一个JSON字符串反序列化成一个JavaScrip…

    JavaScript 2023年5月27日
    00
  • JavaScript 箭头函数的特点、与普通函数的区别

    JavaScript 箭头函数是 ES6 新增的一个语法特性,它可以简化函数的书写形式,同时也具有一些独特的特点与普通函数不同。下面将详细讲解 JavaScript 箭头函数的特点、与普通函数的区别。 JavaScript 箭头函数的特点 JavaScript 箭头函数的特点如下: 箭头函数使用 => 符号定义; 箭头函数不需要使用 function …

    JavaScript 2023年5月27日
    00
  • js 得到文件后缀(通过正则实现)

    要得到一个文件的后缀,可以通过以下步骤来实现: 步骤 1:获取完整文件名 首先,我们需要获取文件的完整文件名,可以通过以下方式来获取: let fileName = ‘example.txt’; 步骤 2:通过正则表达式获取文件后缀 我们可以使用正则表达式来获取文件的后缀,正则表达式的语法为: /\.[^.]+$/g 该正则表达式的含义为: /\. :匹配以…

    JavaScript 2023年5月27日
    00
  • javascript中floor使用方法总结

    下面来详细讲解一下“javascript中floor使用方法总结”。 什么是floor函数? floor是Javascript内置的一个Math对象里的函数,可以得到一个小数的整数部分。 floor怎么使用? floor函数的使用很简单,可以直接用Math对象调用: Math.floor(3.14); // 3 上面的代码,调用了Math对象的floor方法…

    JavaScript 2023年5月28日
    00
  • js裁剪(分隔)字符串的三种常用方法

    当我们处理字符串时,经常需要对字符串进行裁剪或者分隔,这里我介绍三种常用的JavaScript字符串处理方法。 方法一:使用substr方法裁剪字符串 substr方法基于指定的起始下标和长度裁剪给定的字符串。 const originalString = "Hello, World!"; const startIndex = 7; //…

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