当问到你JS的防抖和节流优化,你能手写吗?(二)

引言

在上一部分我们向大家分享了JS的防抖,接下来我要向大家介绍一下它的好兄弟:节流

节流

其实和防抖类似,在前端开发中,有些事件会被频繁触发,如窗口滚动、鼠标移动等。这些事件在处理时如果不进行限制可能就会对性能造成影响,因此需要采用一些技术来优化代码,减少重复的处理。节流就是一种常用的技术,它可以限制函数的执行频率,保证在一定时间内只执行一次函数。

原理

JS节流的实现原理其实与防抖类似,都是通过设置定时器来延迟函数的执行。不同之处在于,节流会在一定时间内执行多次函数,但是保证在这段时间内只执行一次。这样可以减少函数的执行次数,提高页面的性能,而防抖则是只执行一段时间只进行了一次的执行。

具体来说,JS节流的实现原理可以通过以下几步来总结:

  1. 首先,我们需要了解什么是节流。节流是指在一定时间内,只执行一次函数。与防抖不同的是,节流会在一定时间内执行多次函数,但是保证在这段时间内只执行一次。

  2. 接下来,我们需要实现一个节流函数。这个函数可以接收两个参数:要执行的函数和节流时间。在函数内部,我们需要使用一个判断来看是否可以执行函数。

js 复制代码
 function throttle(fn,delay){

      let prevTime = Date.now()

      return function(){
        
        if(Date.now() - prevTime >= delay){
          fn()
          prevTime = Date.now()  
        }  
        
      }
    }

在这个丐版的节流函数中,我们需要用到一个Date对象,他是js的一个内置对象,Date其实储存的就是创建它时的时间,包含年,月,日,星期和时分秒,我们可以通过getSeconds() 方法返回它的秒数。但是我们用这种方法只获取秒数很有可能出现过一分钟再点击,那它秒数有什么意义呢?当然一个个比对也不现实,所以我们提到了一个叫做时间戳的东西,而我们使用的就是Date对象自带的now方法,它会返回一个数字,表示自 UNIX 纪元开始(1970 年 1 月 1 日 00:00:00 (UTC))到当前时间的毫秒数。

我们同样使用闭包保存了上一次的时间,二者相减就得到了我们想要的时间差,只要时间差大于我们的要求,我们就可以执行下一次,否则只执行第一次,所以你也可以根据这个知道我们防抖和节流的区别,一个一直触发执行了第一次和一直触发一秒一次,一个如果一直触发则不执行

  1. 同样的在实现节流函数的过程中,我们也还需要注意一些细节,但是比防抖会少一些。除去我们的Date对象## 总结

总之,JS防抖是一种比较有用的技术,我们可以使用防抖的方式在高频事件的处理中提高页面性能和用户体验。熟练掌握其实现原理和细节,对于前端开发人员来说是非常重要的,而且面试时很有可能会碰到手写一个防抖函数。是新的内容,你会眼尖地发现,这个丐版少的内容和防抖丐版简直一模一样,让我们一起来看看完整手写吧:

完整手写实现:

js 复制代码
 function throttle(fn,delay){

      let prevTime = Date.now()

      return function(){
        
        if(Date.now() - prevTime >= delay){
          fn.apply(this,arguments)
          prevTime = Date.now()  
        }         
      }
    }

如果看了上一篇文章你就很清楚它的变化了,我们保留了不定的参数传入和维持了this指针的绑定不变,如果没有看上一篇文章的话可以返回去看一看,上一篇文章有更加细致的解释。

这样,我们就实现了一个基本的JS节流函数。在实际应用中,我们可以根据具体的场景来设置节流时间,以达到最佳的性能和用户体验。

应用场景

JS节流的应用场景非常广泛,特别是在高频事件的处理中,如窗口滚动、鼠标移动、键盘输入等。下面是一个常见的应用场景:

js 复制代码
 let btn = document.getElementById('btn')

    function send(){
      console.log('已提交');
    }

    btn.addEventListener('click',throttle(send,1000))

    function throttle(fn,delay){
      let prevTime = Date.now()
    
      return function(){
        
        if(Date.now() - prevTime >= delay){
          fn.apply(this,arguments)
          prevTime = Date.now()  
        }  

      }
    }

当我们有一个按钮被人疯狂点击的时候,我们就可以1000毫秒调用一次send函数了。

总结

总之,JS节流是一种比较有用的技术,我们可以使用防抖的方式在高频事件的处理中提高页面性能和用户体验。熟练掌握其实现原理和细节,对于前端开发人员来说是非常重要的,而且面试时很有可能会碰到手写一个节流函数,当然它的出现往往是和防抖一起的,所以防抖更应该搞明白哦~

那么文章到这里就结束啦~

如果你想了解更多这类文章,点赞关注作者更新更多后续~

相关推荐
丑陋小蚊子1 小时前
项目数据不能公开,就写清交付物
面试·求职招聘·大学生·简历·简历下载
2601_949950635 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
福兮说6 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
时间的拾荒人7 小时前
Qt 多线程详解:从 QThread 到实战
开发语言·qt·面试
海绵宝宝转agent7 小时前
MySql高频面试八股开源笔记总结
mysql·面试·开源
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6667 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人8 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)8 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
lsc_blog8 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘