前端小技巧:深度理解节流和防抖函数

1.前置知识

首先,我们要知道节流函数和防抖函数都是用来解决高频发事件的问题,因为实际工程中如果让onscroll这些高频事件每一次触发都生效,那样将大大降低浏览器的性能。

  • 既然两者的效果都一样,那为什么需要两个函数呢?
  • 虽然两个最终的目的相同,但是两者降低事件生效频次的方式不同,因此会被应用于不同的场景。

2.节流函数(throttle)

定义:

节流函数就是在事件被触发后的规定时间n秒后再执行回调函数,如果在这n秒延时内事件又被触发,则该事件不会重新计时,依旧会按照第一次触发的时间计时,直到该事件生效完成。

实际应用场景:

节流函数的应用场景一般是一些触发十分频发的事件,如:onscroll(鼠标滚动事件),mousemove(鼠标移动事件)。

经典案例:要求在鼠标移动时获取鼠标坐标

先看

不使用节流函数,直接读取鼠标位置的效果图:

前端小技巧:深度理解节流和防抖函数

可以看到,如果工程中直接去读取的话,由于读取操作过于频繁,将过多消耗浏览器的内存,从而导致浏览器的性能大大降低,因此我们需要使用节流函数来包装一下,从未降低读取频率。

使用节流函数代码:

html代码:

Javascript代码:

效果图:

前端小技巧:深度理解节流和防抖函数

可以看出,用了节流函数之后浏览器在设定好的时间1秒内只读一次,这样大大增强了浏览器的性能,避免了频繁的去读取鼠标的位置。

3.防抖函数

定义:

防抖函数就是在事件被触发的n秒后再执行回调函数,如果在这n秒延时内事件又被触发,则该事件会重新计时,也就是说会按照最后一次触发事件的时间开始计时。

实际应用场景:

防抖函数很常用的一个应用场景就是设计类似百度的搜索输入框,我们需要在用户全部内容输入完成后的n秒后再向服务器发送请求,而并不是说打一个字就发一次请求,如下图:

前端小技巧:深度理解节流和防抖函数

写个防抖函数加深理解:

html代码:

Javascript代码:

效果图:​

前端小技巧:深度理解节流和防抖函数

可以看到,当我们在1s内不断触发点击按钮事件时,回调函数的延时会不断被重置,直到用户1内不再触发该点击事件,最后才执行我们的回调函数。

4.总结

4.1两者相同点

防抖函数和节流函数都应用于高频触发的事件,作用都是降低事件的生效频次,从而提高浏览器性能。

4.2两者不同点

在规定延时时间内

节流函数生效第一次的触发事件

防抖函数生效最后一次的触发事件


这里是【IT人一直在路上】,关注我,学习更多前端技术,一起从小白走向高级工程师。


分享到:


相關文章: