防抖和节流 含义及区别图文详解秒懂

防抖和节流都是为解决短时间内频繁触发某个功能函数而导致的性能问题。比如,触发频率过高而导致响应速度跟不上,以致出现延迟,假死或卡顿的现象。 

防抖

图解:一件事情,计划5s以后触发,结果中途意外触发了,那么就重新从0开始5秒的计时,这就导致本身计划的事情就延迟触发了,当...在延迟的5秒过程当中又再次意外触发了,就继续从0开始5秒的计时,而不会执行事件处理函数,那么什么时候触发5s后的事件呢,就是不再触发的时候。

函数防抖 代码解:

看下面防抖函数,每次触发时 有定时器  就 clearTimeout 清空定时器,如果频繁触发就一直清空定时器, 等停止触发的时候,只执行最后一次定时器事件才会发送请求, 这种函数虽然会多次执行 但是最终的有效代码 只执行一次的行为 称为 防抖

// 防抖函数
function debounce(delay) {
  let timer //声明一个存储定时器的变量
  return function () {

    if (timer) clearTimeout(timer) 
    timer = setTimeout(() => {
      // 暂时理解不了(this,arguments)指向改变的问题
      // getList.call(this, arguments)

      getList(obj)
      // 不输入延迟 则默认 1000 ms
    }, delay || 1000)
  }
}

防抖后的效果:看!!!等停止触发的时候,只执行最后一次事件,就是防抖的核心。

如果停止输入但是在指定间隔内又输入,会重新触发计时。

在这里插入图片描述

节流

介绍:js 节流阀

通过判断是否到达一定时间来触发回调函数。

顾名思义节流,也是节省能耗的一种,防止多次频繁触发事件导致资源的不必要浪费,但是节流 是需要 有效代码会根据固定频率去执行,原理就是定义一个节流阀,在执行的事件当中打开节流阀,最重要的是在下次执行这个事件之前要判断,打开的节流阀是否存在,上次事件还存在的话就停止继续执行等待执行完毕,不存在的话就继续执行。

函数节流 代码解: 

看下面节流函数,这里利用定时器演示节流效果,先定义空的定时器timer,如果有timer就中断执行,第一次执行肯定是没有timer,对timer进行定时器赋值,下面就会执行定时器中的请求,定时器中请求完成后对节流阀timer重新放开(这一步是节流的核心),每次请求完成都需要打开节流阀,只有当节流阀 timer 为null时再次点击执行事件才会进行下一次请求事件,否则重复多次点击执行事件时就会先判断之前节流阀是还存在吗,是就中断函数执行

function throttle(foo,delay){
    // foo-被执行节流的函数
    // 节流的节奏时间间隔
 
    // 初始化timer,并使用闭包访问
    let timer;
    return function(){
        // 若之前已有节流,中断函数执行
        if(timer) return;
        // 若(之前/此时)无节流,重新设定节流
        timer = setTimeout(()=>{
            // 暂时理解不了(this,arguments)指向改变的问题
            foo.call(this,arguments)
            // 本次节流执行后,通过给timer赋值null,释放timer
            timer = null
            // 不输入延迟 则默认 1000 ms
        },delay || 1000)
    }


    //也可以设置节流阀为布尔值或者是一个变量,通常是布尔值多些
    function throttle(fn, delay = 200) {
        let flag = true
        return function (...args) {
            if (!flag) {
                return
            }
            flag = false
            setTimeout(() => {
                fn.apply(this, args)
                flag = true
            }, delay)
        }
    }

 要注意的是,防抖和节流返回的都是回调函数,需要先用变量接收,再进行变量的调用。

 防抖和节流的区别:

防抖:函数虽然会多次执行 但是有效代码只执行一次
节流:函数虽然会多次执行 但是有效代码只会根据固定频率去执行

这是关键区别:

  • 防抖有重置概念
  • 节流没有重置概念

  • 同样有多次执行操作,防抖是将多次变为执行最后一次
  • 节流是降低执行频率,变成隔一段时间执行一次

  • 防抖每次触发的时候都会先把之前的取消,然后重新执行
  • 节流执行的时候需要判断是否等待上次执行的延时函数

应用场景:

函数防抖(debounce):

  • search搜索联想,用户在不断输入值时,用防抖来节约请求资源;
  • window触发resize或scroll事件的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次。

函数节流(throttle):

  • 一定时间内多次点击一个功能按钮 
  • 鼠标不断点击触发,mousedown(单位时间内只触发一次)
  • 页面无限加载。需用户滚动页面时,每隔一段时间发一次 ajax 请求,而不是只要滚动就请求数据
  • 通过resize,使浏览器页面窗口放大缩小。

部分图 借鉴了掘进的博主文章,非常详细实用

图文结合——详解 js 防抖与节流 - 掘金

<think>嗯,用户想了解防抖节流区别以及它们的应用场景。首先,我得回忆一下这两个概念的基本定义。防抖节流都是用来优化高频触发事件的,但它们的实现方式适用场景有所不同。 防抖,我记得是当事件被频繁触发时,只有在停止触发一段时间后才会执行一次。比如搜索框输入,用户连续输入的时候,我们希望等到用户停止输入后再发送请求,这样可以减少不必要的请求次数。这时候应该用防抖对吧?而节流则是按照固定的时间间隔执行函数,不管事件触发有多频繁。比如窗口的resize或者滚动事件,如果每次变动都执行处理函数,可能会导致性能问题,所以用节流来限制频率,比如每隔200毫执行一次。 接下来要比较它们的区别防抖是延迟执行,直到事件停止触发;而节流是周期性地执行,不管事件是否还在触发。应用场景方面,防抖适合需要等待用户停止操作后再执行的情况,比如搜索建议、表单验证。节流适合在持续触发的事件中保持一定的执行频率,比如滚动加载更多内容或者游戏中的按键处理。 不过用户提供的引用资料里提到了一些具体的例子,比如引用[2]说节流用于resizescroll事件,防抖用于手机号邮箱验证。引用[4]也提到两者都是为了限制执行频次。需要确保我的回答这些资料一致,不能有冲突。比如防抖的应用场景应该包括输入验证,而节流用于高频事件如滚动。 然后要考虑如何组织内容,先分别解释防抖节流的概念,再对比它们的区别,最后给出应用场景。可能需要用一些例子来帮助理解。比如防抖的例子:按钮提交防止重复点击,用户连续点击只在最后一次点击后提交。节流的例子:页面滚动时每隔一段时间检查位置,而不是每次滚动都触发。 还要注意用户提到的引用标识,在回答中适当添加。比如在解释防抖时,引用[3][4]都有相关描述,可以在段落末尾加上引用标记。同样,节流部分可以引用[2][4]。 另外,用户可能想知道如何实现这两个函数。虽然问题没有直接问,但相关资料里有提到实现场景,可能需要在回答中简单说明,比如使用setTimeout来延迟执行,或者使用时间戳来控制执行频率。 最后,生成相关问题。根据用户提供的示例,可能需要问及两者的具体实现方法、实际应用案例以及如何选择使用哪一种。需要确保问题与主题相关,并且能够帮助用户进一步学习。 总结一下,回答的结构应该是:定义防抖节流,对比区别,应用场景,引用资料中的例子,最后生成相关问题。要注意使用正确的中文表达LaTeX格式,但用户的问题中没有数学公式,所以可能不需要使用数学表达式。不过系统级指令提到行内数学表达式要用$...$,但这里可能用不上,所以可能不需要处理这部分。</think>### 防抖节流的概念及区别 **防抖(Debounce)** 当事件频繁触发时,仅在最后一次触发后等待指定时间$t$,若期间无新触发则执行函数。若在$t$时间内再次触发,则重新计时[^3]。 **应用场景**: - 搜索框输入联想(等待用户停止输入后再请求) - 表单验证(输入停止后统一验证) - 窗口缩放结束后的布局调整[^2] **节流(Throttle)** 在单位时间$t$内,无论事件触发多少次,仅执行一次函数。后续触发需等待当前周期结束[^4]。 **应用场景**: - 页面滚动事件(如无限加载内容) - 游戏中的高频按键响应(限制操作频率) - 实时鼠标移动轨迹记录[^2] ### 核心区别 | **特性** | **防抖** | **节流** | |----------------|--------------------------|--------------------------| | **触发逻辑** | 等待触发停止后执行 | 固定时间间隔执行 | | **响应时机** | 最后一次触发后延迟$t$时间 | 周期内首次或末次触发[^4] | | **适用场景** | 避免重复执行最终操作 | 控制高频事件执行频率 | ### 技术实现对比 1. **防抖伪代码**: ```javascript function debounce(func, delay) { let timer; return function(...args) { clearTimeout(timer); timer = setTimeout(() => func.apply(this, args), delay); }; } ``` 2. **节流伪代码**: ```javascript function throttle(func, interval) { let lastTime = 0; return function(...args) { const now = Date.now(); if (now - lastTime >= interval) { func.apply(this, args); lastTime = now; } }; } ``` ### 选择原则 - 若需确保最终状态被处理(如提交按钮防重复点击)→ **防抖** - 若需保持周期性反馈(如滚动进度条更新)→ **节流**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值