首页 > 编程语言 >详细解读JavaScript中的防抖(debounce)和节流(throttle)!!!

详细解读JavaScript中的防抖(debounce)和节流(throttle)!!!

时间:2024-03-22 11:03:35浏览次数:46  
标签:触发 防抖 throttle 函数 debounce inThrottle 执行 节流

在JavaScript中,防抖(debounce)和节流(throttle)是两种常用的技术,用于限制函数的执行频率,特别是在处理高频事件(如窗口的resize、scroll,输入框的keyup、mousedown等)时非常有用。

防抖(debounce)

防抖的基本思想是将多次执行变为最后一次执行。也就是说,在事件被触发后n秒内函数只能执行一次,如果在这n秒内又被重新触发,那么会重新计算执行时间。这就像是在百度搜索时,每次输入之后都有联想词弹出,这个控制联想词的方法就不可能是输入框内容一改变就触发的,它一定是当你结束输入一段时间之后才会触发。

防抖的实现过程大致如下:当事件触发时,相应的函数并不会立即被触发,而是会等待一定的时间;当事件密集触发时,函数的触发会被频繁的推迟;只有等待了一段时间也没有事件触发,才会真正的执行响应函数。

节流(throttle)

节流的基本思想是将多次执行变成每隔一段时间执行。也就是说,预定一个函数只有在大于等于执行周期时才执行,周期内调用不执行。这就像是在淘宝抢购某一件限量热卖商品时,你不断点刷新点购买,可是总有一段时间你点上是没有效果,这里就用到了节流,就是怕点的太快导致系统出现bug。

在实现上,节流通常使用时间戳和定时器来实现。当事件触发时,会检查当前时间与上次执行函数的时间差,如果小于设定的执行周期,则不执行函数;如果大于或等于执行周期,则执行函数并更新上次执行时间。此外,还可以使用定时器来定期执行函数,但需要注意在适当的时候清除定时器以避免内存泄漏。

实例说明
我这里分别举一个防抖(debounce)和节流(throttle)的例子来说明它们的用法和效果。

防抖(debounce)

假设我们有一个搜索框,用户可以在其中输入文字进行搜索。我们不希望用户每输入一个字符就发送一次搜索请求,因为这样会造成大量的不必要的请求和服务器负担。我们可以使用防抖技术来解决这个问题。

function debounce(func, wait) {
    let timeout;
    return function() {
        const context = this;
        const args = arguments;
        clearTimeout(timeout);
        timeout = setTimeout(function() {
            func.apply(context, args);
        }, wait);
    };
}

const searchInput = document.querySelector('#searchInput');
searchInput.addEventListener('input', debounce(function(event) {
    // 这里发送搜索请求
    console.log('执行搜索:', event.target.value);
}, 500));

在这个例子中,debounce 函数返回一个新的函数,这个新函数在每次被调用时都会取消之前的定时器并设置一个新的定时器。因此,只有在停止输入一段时间(这里是500毫秒)后,才会执行搜索函数。

节流(throttle)

假设我们有一个滚动事件监听器,当用户滚动页面时,我们需要执行一些操作(比如更新导航栏的位置)。但是,滚动事件会非常频繁地触发,如果我们直接在每个事件触发时都执行操作,会造成页面的卡顿。我们可以使用节流技术来解决这个问题。

function throttle(func, limit) {
    let inThrottle;
    return function() {
        const args = arguments;
        const context = this;
        if (!inThrottle) {
            func.apply(context, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    }
}

window.addEventListener('scroll', throttle(function() {
    // 这里执行一些操作
    console.log('页面滚动了');
}, 200));

在这个例子中,throttle 函数返回一个新的函数,这个新函数在每次被调用时都会检查一个标志位 inThrottle。如果 inThrottlefalse,则执行函数并将 inThrottle 设置为 true,然后设置一个定时器在一段时间后(这里是200毫秒)将 inThrottle 设置回 false。因此,只有在每个200毫秒的时间段内第一次触发滚动事件时,才会执行操作函数。

标签:触发,防抖,throttle,函数,debounce,inThrottle,执行,节流
From: https://blog.csdn.net/qq_43536788/article/details/136796880

相关文章

  • 分享一个之前开发的react键盘事件的快捷键实现,组合键,支持防抖和节流,通过自定义hooks实
    npm包地址:linkgithub地址:linkreact-khooksGettingStarted......
  • js面试(防抖)
    一、什么是防抖防抖(Debounce)是一种用于减少特定事件触发频率的技术。在编程中,它通常用于确保函数或方法不会在很短的时间内被频繁调用,这有助于优化性能并避免不必要的计算或操作。防抖的实现原理是,在事件被触发后,一个定时器会被设置。如果在定时器完成之前,相同的事件再次被触发,......
  • 前端防抖-通过自定义指令实现
    前端防抖-通过自定义指令实现1、通过自定义事件实现前端防抖Vue.directive('preventReClick',{inserted(el,binding){el.addEventListener('click',()=>{if(!el.disabled){el.disabled=truesetTimeout(()=>......
  • tsx格式防抖
    定义:import{useCallback,useEffect,useRef}from'react';exportinterfaceDebounceRefType{fn:Function;timer?:NodeJS.Timeout;}exporttypeDebouncePropsType=[Function,number,any[]?];constuseDebounce=(...[fn,debounce,dep......
  • 关于lodash.debounce的配置
    最近在改一个bug的时候反馈说一个弹窗表单在快速多次的点击提交按钮时有可能重复提交,于是我在检查这个表单的时候发现他的防抖是这样配置的:submit1:debounce(function(){console.log(1);this.cancel(true);},500),乍一看好像没什么问题,于是我查询了文档 l......
  • 在JavaScript中的防抖函数 - 通过在React中构建自动完成功能来解释
    当你将一个新应用推向生产环境时,你希望确保它用户友好。网站的性能是用户体验的关键部分。每个用户都希望网站及其内容能够快速加载。每一秒都是宝贵的,可能导致用户再也不会访问你的网站。在本指南中,我们将了解JavaScript中一个非常重要的技术,即防抖函数。然后,我将向您展示如何在......
  • 防抖与节流
    防抖与节流的本质就是:通过闭包特性减少操作次数举一个现实生活中的例子//两个大巴的故事//防抖,//A大巴:车上上去一个人,五分钟之内不上人,发车。//节流。//B大巴:车上上去一个人之后,五分钟之后发车。//发车!网络请求(A=>B)提高利用率减少B的压力。//......
  • 浅谈闭包(防抖,节流,函数柯里化)
    闭包参考文章谈谈你对闭包的理解概念:(1)闭包就是引用了另一个函数的变量的函数(2)闭包一般是函数嵌套,一个函数返回另外一个函数,内部函数访问外部函数的变量就形成了一个闭包作用(优点):(3)闭包的优点是可以私有化变量,将变量私有化到函数内部,并在私有化的基础上进行数据保持......
  • 防抖
    function debounce(func, delay) {    let timerId;      return function() {        clearTimeout(timerId); // 清除之前设置的计时器              const context = this;        const args = arguments;  ......
  • js封装防抖函数
    js封装的防抖函数/**防抖函数*@param{Function}func*@param{number}wait*@param{boolean}immediate*@return{*}*/exportfunctiondebounce(func,wait,immediate){lettimeout,args,context,timestamp,resultconstlater=function(){......