温故而知新,详细讲讲JavaScript的防抖与节流

举报
码喽的自我修养 发表于 2024/07/24 23:29:21 2024/07/24
【摘要】 大家好,我是码喽的自我修养!今天给大家详细讲讲JavaScript的防抖与节流,包含二者的区别与优缺点、使用场景,并提供具体代码帮助大家深入理解,彻底掌握!

一、概念

一句话概括 :JavaScript中的防抖(debounce)和节流(throttle)是用于控制函数执行频率的技术。

1.防抖

当一个事件连续触发时,防抖技术将只执行最后一次触发事件的函数调用。换句话说,只有在停止触发事件一段时间后,才会执行函数。(即:n秒后再执行该事件,若在n秒内被重复触发,则重新计时)

使用防抖的场景 

搜索框输入联想:

用户在输入时,如果一直输入,会频繁触发搜索请求,使用防抖可以减少请求的次数,只在用户停止输入后才发送请求。

页面滚动加载更多:

当用户滚动页面时,会频繁触发加载更多数据的函数,使用防抖可以减少请求的次数,只在用户停止滚动后才发送请求。 

防抖示例代码 

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 input = document.querySelector('input');  
input.addEventListener('input', debounce(function() {  
  console.log('Input value:', input.value);  
}, 200));

2.节流

当一个事件连续触发时,节流技术会限制函数的执行频率。换句话说,函数在一段时间内只会执行一次。(即:n秒内只运行一次,若在n秒内重复触发,只有一次生效

使用节流的场景

页面滚动事件:

当用户滚动页面时,会触发滚动事件,如果不使用节流技术,可能会导致页面卡顿。使用节流可以限制滚动事件的触发频率,减少卡顿现象。

给按钮增加loading

在调用接口时触发loading加载效果,接口数据返回后关闭loading加载,期间点击按钮将不会重复触发函数执行

 节流示例代码 

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

使用 

const input = document.querySelector('input');  
input.addEventListener('input', throttle(function() {  
  console.log('Input value:', input.value);  
}, 200));

总结

无论是防抖还是节流,都可以通过传递一个延迟时间参数来控制函数的执行频率。在实际应用中,根据具体需求选择使用防抖还是节流技术。

二、区别

防抖和节流都是用于控制函数执行频率的技术,但它们的实现方式和效果有一些区别

区别如下

触发时刻:

防抖:只有在事件停止触发一段时间后,才会执行函数。

节流:在一段时间内只会执行一次函数。

执行次数:

防抖:只会执行最后一次触发事件的函数调用。

节流:在一段时间内只会执行一次函数调用。

实现方式:

防抖:在事件触发后设置一个定时器,在定时器延迟时间内没有再次触发事件,则执行函数。

节流:在事件触发时设置一个定时器,在定时器延迟时间内触发事件则不执行函数。只有当定时器执行完毕后,才能再次触发执行函数。

使用场景:

防抖:适用于连续事件触发的情况,如搜索框输入、滚动加载更多等。
节流:适用于高频率事件触发的情况,如页面滚动、鼠标移动等。

根据具体的需求,选择使用防抖或节流技术可以有效地控制函数的执行频率,提升用户体验和性能。


如果还想了解其他关于js的知识,欢迎关注作者哦~

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。