2021-09-12 聊一聊JS中的防抖与节流

防抖和节流是优化前端性能的常用技术,尤其在处理频繁触发的DOM事件如滚动、输入等时。防抖确保在一定时间内只执行最后一次操作,避免频繁执行,而节流则限制了执行频率,确保一定间隔内只执行一次。本文通过代码示例介绍了如何封装防抖和节流函数,并展示了它们在输入框和滚动事件中的应用,以提高用户体验和性能。
摘要由CSDN通过智能技术生成

防抖节流经常在面试中经常被问到,它也确实是经常被我们解决频繁触发DOM事件的两种解决方案。那今天就来聊一聊防抖与节流吧。

什么是防抖

在这里插入图片描述
就比如滚轮的滚动事件,或者是 input表单,当我们获取输入框的值时我们可能需要的时用户最后输入的内容,而不是输入一个字母就触发一次,这个时候我们就需要使用防抖函数。
概念

防抖就是一定时间内只执行最后一次任务

封装防抖函数 debounce

在一定时间内事件被频繁的触发,只执行最后一次事件
接下来我们来看一下代码。
首先在页面中创建一个文本框

<input type="text" /> 

假如我们不使用防抖函数获取输入框的value值效果

  let inValue = document.querySelector("input");
  inValue.oninput  = function(){
   //这样会让事件不停的触发,影响性能
   console.log(this.value);
 }

在这里插入图片描述
我们可能需要的只是最后的一个结果,但是你在输入内容时就会不停的触发事件,需要执行好多次,这样大大影响了效率。 所以我们需要进行接下来的防抖操作。


封装防抖函数

<script>
  //一般用在滚动条,input事件中
  let inValue = document.querySelector("input");
 //封装防抖函数(利用定时器,闭包。在一段时间内不停的被触发,前面的事件会被清除,只执行最后一次触发的事件,在一定时间内只触发一次)
  inValue.oninput = debounce(function () {
    // 此函数执行的是业务逻辑
    console.log(this.value);
  }, 500);
  function debounce(fn, delay) {
    //此时timer不是全局变量,不会被释放.
    let timer = null;
    return function () {
      clearTimeout(timer);
      timer = setTimeout(() => {
        fn.call(this);
      }, delay);
    };
  }
</script>

实现的效果如下:
在这里插入图片描述
这样的话拿到的是最终的一次结果,在每次输入时下一次事件都会将上次的事件清空,以至于只执行了一定时间内的最后一次事件。


节流

概念

节流就是一定时间内只执行一次任务,控制执行次数
控制执行次数:fn 要执行时,等待 delay 时间完了之后再执行 fn
我们以滚轮事件为例,

不使用节流时的效果,只要你操作滚轮事件就会不停的触发,和上面防抖的效果差不多。

 window.onscroll = function(){
    console.log(111);
 }

使用节流函数时的效果一段事件内只触发一次、

<script>
  //节流:控制执行次数
  window.onscroll = throttle(function () {
    console.log(111);
  }, 1000);
  //封装节流函数
  function throttle(fn, delay) {
    let timer = null;
    return function () {
      if (!timer) {
        //此时你不停的滑动滚轮,也是500毫秒输出一次内容。
        timer = setTimeout(() => {
          fn.call(this);
          timer = null;
        }, 1000);
      }
    };
  }
</script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript 防抖(debouncing)和节流(throttling)是两种优化高频率触发事件的方法,可以减少代码的执行次数,提高性能。 防抖 防抖是指在事件被频繁触发时,只有在一定时间内没有新的触发事件才会执行事件处理函数。在这段时间内,如果事件又被触发,则重新计时。 防抖的实现思路是:在事件处理函数执行前,设置一个定时器,如果在定时器时间内再次触发了事件,则清除原定时器并重新设置一个新的定时器,如此反复。如果在定时器时间内没有再次触发事件,则执行事件处理函数。 防抖的应用场景包括:搜索框输入、窗口调整等需要频繁触发事件时,可以通过防抖来减少事件处理函数的执行次数。 示例代码: ```javascript function debounce(func, delay) { let timer = null; return function () { const context = this; const args = arguments; clearTimeout(timer); timer = setTimeout(function () { func.apply(context, args); }, delay); }; } const searchInput = document.getElementById("search-input"); const searchHandler = function () { console.log("执行搜索操作"); }; searchInput.addEventListener("input", debounce(searchHandler, 500)); ``` 上面的代码,`debounce` 函数接受一个事件处理函数和一个时间间隔作为参数,返回一个新的函数,这个新函数在被调用时会执行事件处理函数,但是在执行前会设置一个定时器,如果在时间间隔内再次被调用,则会清除原定时器并重新设置一个新的定时器。 节流 节流是指在事件被频繁触发时,只有在一定时间间隔内执行一次事件处理函数。在这段时间内,如果事件又被触发,则忽略这次触发。 节流的实现思路是:在事件处理函数执行前,判断距离上一次执行的时间间隔是否超过了指定的时间间隔,如果超过了,则执行事件处理函数并更新上一次执行时间;否则忽略这次事件触发。 节流的应用场景包括:页面滚动、DOM 元素拖拽等需要频繁触发事件时,可以通过节流来减少事件处理函数的执行次数。 示例代码: ```javascript function throttle(func, delay) { let lastTime = 0; return function () { const context = this; const args = arguments; const now = new Date().getTime(); if (now - lastTime >= delay) { func.apply(context, args); lastTime = now; } }; } const scrollHandler = function () { console.log("执行页面滚动操作"); }; window.addEventListener("scroll", throttle(scrollHandler, 500)); ``` 上面的代码,`throttle` 函数接受一个事件处理函数和一个时间间隔作为参数,返回一个新的函数,这个新函数在被调用时会执行事件处理函数,但是在执行前会判断距离上一次执行的时间间隔是否超过了指定的时间间隔,如果超过了,则执行事件处理函数并更新上一次执行时间;否则忽略这次事件触发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

BoZai_ya

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

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

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

打赏作者

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

抵扣说明:

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

余额充值