2022.3.19补充
节流函数的另一种实现方式:
两者的区别:
防抖函数:在一定时间内执行一个方法多次,只执行最后一次。因为在事件触发会先清理timer,如果时间间隔不到则会被清理掉,只有你的间隔到了之后才会执行,因此前面的函数都会被清理掉。
节流函数:在一定时间内执行一个方法多次,只有第一次生效。因为在事件触发后会先判断timer是否存在,只有不存在的时候才会执行。
相当于防抖是强制清理,节流是不到时间进不了大门。
throttle节流阀技术可以防止事件函数(例如滚轮滚动)的回调函数被频繁调用。
节流阀函数的实现原理是:
节流函数每次执行时都会检查上次执行的时间,通过指定wait参数,来保证只有距离上次执行超过一定时间,才会真正执行内部包裹的回调函数。由此来避免一种重量级的函数(如重绘或者dom操作)被频繁调用而导致产生性能问题。
以underscore.js的实现为例
var scroller = document.getElementById('scroller_div')// 此时console.log最多每300毫秒打印一次,不管onscroll事件触发得多么频繁,都不会超过这个频率。
scroller.onscroll = _.throttle(function (){
console.log(scroller.scrollTop)
}, 300)