防抖(debounce)
原理
触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。
实现方式
每次触发事件时设置一个延迟调用的方法,并且取消前一次的延迟调用方法。
//防抖函数function debounce(fn) {let timer = null;return function () {if (timer) clearTimeout(timer);timer = setTimeout(function () {fn(...arguments)}, 500)}}//事件处理函数function fn(e) {console.log(this.name);//'防抖'console.log(document.documentElement.scrollTop)}//验证this指向let obj = {fn,name: '防抖'}window.addEventListener('scroll', debounce(obj.fn.bind(obj)));//用bind方法绑定this
缺点
应用场景
- search搜索框,用户不断输入值时,用防抖来节约请求资源。
- window触发resize,scroll等事件时,会不断触发,用防抖来让他只执行一次。
节流(throttle)
原理
触发高频事件后,n秒内只执行一次,所以节流会稀释函数的执行频率。
实现方式
每次触发事件时,如果当前有等待执行的延迟函数,则直接return。
/** 节流 */function throttle(fn){let canRun = true;return function(){if(!canRun) return;canRun = false;setTimeout(function(){fn(...arguments);canRun = true;},500);}}function fn(){console.log(document.documentElement.scrollTop);}window.addEventListener('scroll', throttle(fn))
应用场景
- 鼠标不断点击触发,mousedown单位时间内只触发一次。
- 监听滚动事件,比如是否划到底部自动加载更多,用节流来判断。
