✨性能优化之防抖节流篇

简介: ✨性能优化之防抖节流篇

前言


防抖节流作为前端面试经典手撕代码题,掌握防抖和节流是一个前端开发人员工程能力的体现,不会封装防抖和节流?一起来学习吧~🙆‍♂️


防抖(debounce)


基本概念


在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。


举个🌰子


我们在搜索框输入关键词进行搜索时,就会发送ajax请求,然后展示在列表,这是一个很常见的场景,接下来我们来模拟一下:


<span>防抖案例</span>
  <input type="text">
复制代码


const input = document.querySelector('input')
    input.addEventListener('keyup',function(){
    // 模拟ajax请求
      console.log(input.value);
    })
复制代码


cac8c32bb78e41b2aedb3e37c0ed40f6_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


我们会发现每次只要按下键盘都会发送ajax请求,然而这是非常浪费资源的,我们应该在用户输入完字符后一段时间再发送ajax请求,我们来优化一下~


const input = document.querySelector('input')
    let timer = null
    input.addEventListener('keyup',function(){
      if(timer) {
        clearTimeout(timer)
      }
      timer = setTimeout(()=>{
        // 模拟ajax请求
        console.log(input.value);
        // 清空定时器
        timer = null
      },500)
    })
复制代码


2ba2332e4c7b427ab416da3ef011460a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif



我们通过演示可以发现,当你在频繁的输入时,并不会发送请求,只有当你在500ms内没有输入时,才会执行函数。如果停止输入但是在指定间隔内又输入,会重新触发计时。这样我们的防抖功能就实现啦~


防抖就好像是英雄释放技能时的读条,技能读条没读完再次使用该技能就会重新读条。


封装防抖函数


上面我们只对该输入框做了防抖,如果有多个输入框需要做防抖,我们不应该把这个防抖功能再实现一次,应该封装一个防抖函数,该使用防抖的时候调用它即可,我们来尝试吧~


// 封装防抖函数
    function debounce(fn,delay = 500){
      let timer = null
      return function(){
        if(timer) {
          clearTimeout(timer)
        }
        timer = setTimeout(()=>{
          fn.apply(this,arguments)
          timer = null
        },delay)
      }
    }
    // 使用
    input.addEventListener('keyup',debounce(function() {
      console.log(input.value);
    },500))
复制代码


节流(throttle)


基本概念


规定在一个单位时间内,只能触发一次函数。如果这个单位时间内触发多次函数,只有一次生效。


举个🌰子


拖拽一个元素时,要随时拿到该元素被拖拽的位置,如果没有节流,只要该元素移动1丢丢,哪怕是1px,都会获取当前拖拽的位置,这是非常消耗性能的,容易造成卡顿。


a0329740f3844b6b89edaac4fc7f264c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


那我们就来优化一下,使用节流,每500ms获取当前元素的位置,来看代码:


const div1 = document.querySelector('div')
    let timer = null
    div1.addEventListener('drag',function(e){
      if(timer) {
        return
      }
      timer = setTimeout(()=>{
        console.log(e.offsetX,e.offsetY);
        timer = null
      },500)
    })
复制代码


这样我们的节流操作就做好啦,来看效果~


403d2a7c8eca44dab734fcbcd9d8601c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.gif


节流就好像是你在玩吃鸡时,即使你猛戳开火键,子弹也只会以预定的速度射出,这么样是不是很好理解。


封装节流函数


// 封装节流
    function throttle(fn,delay = 500) {
      let timer = null
      return function() {
        if(timer) {
          return
        }
        timer = setTimeout(()=>{
          fn.apply(this,arguments)
          timer = null
        },delay)
      }
    }
    // 使用
    div1.addEventListener('drag',throttle(function(e){
      console.log(e.offsetX,e.offsetY);
    },500))
复制代码


最后


⚽本文介绍了性能优化中的防抖节流的概念以及如何使用~

⚾如果这篇文章对你有帮助的话,麻烦点赞收藏哟~

相关文章
|
7月前
|
前端开发 JavaScript Java
面试官:什么是防抖和节流?如何实现?应用场景?
面试官:什么是防抖和节流?如何实现?应用场景?
119 0
|
4月前
|
前端开发 UED 开发者
颠覆你的前端知识:防抖与节流的区别及实战解析!
【8月更文挑战第23天】在Web前端开发中,处理用户界面交互产生的事件可能会影响性能。为此,我们有两种优化方法:防抖(debounce)和节流(throttle)。防抖确保函数仅在事件停止触发一段时间后执行一次,适用于如搜索自动补全场景。而节流则确保函数按固定时间间隔执行,不管用户操作频率如何。本篇技术博客将深入解析两者差异并提供示例代码,帮助开发者更好地理解和应用这些技巧以提升应用性能和用户体验。
90 0
|
3月前
|
存储 缓存 前端开发
灵魂拷问-前端到底能做些什么?--性能优化篇
作者最近在尝试对负责的平台进行性能优化,本文整理了些前端性能优化的一些常见策略。
|
4月前
|
前端开发 测试技术 UED
React性能优化的神奇之处:如何用懒加载与代码分割让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,性能优化至关重要。本文探讨了React中的懒加载与代码分割技术,通过示例展示了如何在实际项目中应用这些技术。懒加载能够延迟加载组件,提高页面加载速度;代码分割则将应用程序代码分割成多个块,按需加载。两者结合使用,可以显著提升用户体验。遵循合理使用懒加载、编写测试及关注性能等最佳实践,能够更高效地进行性能优化,提升应用程序的整体表现。随着React生态的发展,懒加载与代码分割技术将在未来Web开发中发挥更大作用。
55 0
|
4月前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
48 0
|
4月前
|
设计模式 JavaScript 前端开发
说说如何使用事件委托进行性能优化
说说如何使用事件委托进行性能优化
|
7月前
|
缓存 监控 Go
Go语言定时器实战:性能优化与实用技巧
Go语言定时器实战:性能优化与实用技巧
159 0
|
缓存 边缘计算 JavaScript
web前端面试高频考点——性能优化篇(手写防抖、手写节流、XXS攻击、XSRF攻击)
web前端面试高频考点——性能优化篇(手写防抖、手写节流、XXS攻击、XSRF攻击)
155 0
|
Web App开发 JavaScript 前端开发
性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
性能优化之通俗易懂学习requestAnimationFrame和使用场景举例
235 0
|
存储 前端开发 JavaScript
✨从延迟处理讲起,JavaScript 也能惰性编程?
我们从闭包起源开始、再到百变柯里化等一票高阶函数,再讲到纯函数、纯函数的组合以及简化演算;