JS防抖和节流详解

防抖和节流是优化性能的常用方法,控制高频事件执行。防抖确保在设定时间后只执行最后一次触发的事件,适用于搜索输入等场景。节流则保证在设定时间内只执行一次,适合于滚动页面等持续触发的事件。通过防抖和节流函数的实现,可以有效提高页面响应速度和性能。
摘要由CSDN通过智能技术生成

一、防抖和节流作用

防抖和节流是两种常见的优化性能的方法,用于控制某些高频率触发的事件的执行次数,从而提高页面的响应速度和性能。

二、防抖

1、概念

在一定时间内,多次触发同一个事件,只执行最后一次触发的事件。

比如说给的限定时间300ms
~如果在300ms内没有再次触发事件,那么执行函数
~如果在200ms内再次触发函数,那么当前的计时取消,重新开始计时
2、防抖函数实现
function debounce(func, delay) {
  let timer; // 定时器变量
  return function() {
    const context = this; // 保存this上下文
    const args = arguments; // 保存函数参数
    clearTimeout(timer); // 清除上一次的定时器
    timer = setTimeout(() => { // 创建一个新的定时器
      func.apply(context, args); // 执行函数
    }, delay);
  };
}

该函数接收两个参数,分别是需要防抖的函数和防抖延迟时间。函数内部定义了一个变量timer,用于保存定时器的返回值。

在函数内部返回一个新函数,该函数内部保存了this上下文和函数参数,并清除上一次的定时器,创建一个新的定时器,并在延迟时间后执行原函数。

使用该函数可以轻松地实现防抖逻辑,比如:

const searchInput = document.querySelector('#search-input');
searchInput.addEventListener('input', debounce(function() {
  // 这里写搜索逻辑
}, 500));

在输入框输入时,每次输入都会触发防抖函数,但只有在500ms内没有再次输入时,才会执行搜索逻辑。这样可以避免频繁地发送搜索请求,提高页面性能。

3、应用场景

防抖适用于高频率触发的事件,如搜索框输入、窗口大小改变等。

三、节流

1、概念

在一定时间内,多次触发同一个事件,只执行一次事件。

~如果短时间内大量触发同一事件,那么在函数执行一次之后,该函数在指定的时间期限内不在工作,直至过了这段时间才重新生效
~在某个时间内(比如300ms),某个函数只能被触发一次
2、节流函数的实现
function throttle(func, delay) {
  let timer; // 定时器变量
  let lastTime = 0; // 上一次执行时间
  return function() {
    const context = this; // 保存this上下文
    const args = arguments; // 保存函数参数
    const nowTime = +new Date(); // 获取当前时间
    const remainingTime = delay - (nowTime - lastTime); // 剩余时间
    if (remainingTime <= 0) { // 如果剩余时间小于等于0
      clearTimeout(timer); // 清除定时器
      lastTime = nowTime; // 更新上一次执行时间
      func.apply(context, args); // 执行函数
    } else if (!timer) { // 如果定时器不存在
      timer = setTimeout(() => { // 创建一个新的定时器
        lastTime = +new Date(); // 更新上一次执行时间
        timer = null; // 清空定时器变量
        func.apply(context, args); // 执行函数
      }, remainingTime);
    }
  };
}

该函数接收两个参数,分别是需要节流的函数和节流延迟时间。函数内部定义了两个变量,一个用于保存定时器的返回值,一个用于保存上一次执行时间。

在函数内部返回一个新函数,该函数内部保存了this上下文和函数参数,并根据当前时间计算出剩余时间。如果剩余时间小于等于0,则清除定时器,更新上一次执行时间,并执行原函数。如果剩余时间大于0且定时器不存在,则创建一个新的定时器,在剩余时间后执行原函数。

使用该函数可以轻松地实现节流逻辑,比如:

window.addEventListener('scroll', throttle(function() {
  // 这里写滚动逻辑
}, 500));

在滚动页面时,每次滚动都会触发节流函数,但只有在500ms内没有再次滚动时,才会执行滚动逻辑。这样可以减少频繁地执行回调函数,提高页面性能。

4、应用场景

节流适用于持续触发的事件,如滚动页面、拖拽等。

JS中的防抖函数和节流函数是常用的函数优化方法,可以有效控制函数的执行频率和执行时间间隔。 防抖函数的实现可以使用闭包和定时器来实现。通过在函数执行前先清除之前的定时器,然后设置一个新的定时器来延迟函数的执行。如果在指定的时间内再次触发函数,则清除之前的定时器重新设置新的定时器,以此来达到延迟函数执行的效果。下面是一个防抖函数的示例代码: ```javascript function debounce(fn, delay) { var timer = null; return function () { if (timer) clearTimeout(timer); timer = setTimeout(function () { fn(); }, delay); } } ``` 节流函数的实现可以使用定时器和时间戳来实现。在函数的执行过程中,通过判断当前的时间戳与上次执行的时间戳的差值来控制函数的执行频率。如果距离上次执行的时间超过指定的时间间隔,则执行函数,并更新上次执行的时间戳。下面是一个节流函数的示例代码: ```javascript function throttle(fn, delay) { var lastTime = 0; return function () { var currentTime = Date.now(); if (currentTime - lastTime >= delay) { fn(); lastTime = currentTime; } } } ``` 防抖函数适用于在连续触发事件时,只在最后一次触发事件后执行一次函数,常用于输入框的输入事件等场景。节流函数适用于在连续触发事件时,按照指定的时间间隔执行函数,常用于滚动事件、窗口大小改变事件等场景。 以上是防抖函数和节流函数的简单实现和应用场景的介绍,希望对您有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [JavaScript 防抖节流的实现](https://blog.csdn.net/weixin_43853746/article/details/122654312)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [JS函数节流防抖之间的区分和实现详解](https://download.csdn.net/download/weixin_38622962/12947757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关北道.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值