防抖(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单位时间内只触发一次。
- 监听滚动事件,比如是否划到底部自动加载更多,用节流来判断。