1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| const debounce = (fn,delay) => {
// 介绍防抖函数原理,并实现
// your code
}
const throttle = (fn,delay = 500) => {
// 介绍节流函数原理,并实现
// your code
}
|
1)防抖函数
防抖函数原理:
在事件被触发 n 秒后再执行回调,如果在这 n 秒内又被触发,则重新计时。
适用场景:
1.按钮提交场景:防止多次提交按钮,只执行最后提交的一次。
2.服务端验证场景:表单验证需要服务端配合,只执行—段连续的输入事件的最后一次,还有搜索联想词功能类似
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| // 手写简化版实现
const debounce = (fn,delay) => {
let timer = null;
return (...args) => {
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(this,args);
},delay)
}
}
|
2)节流函数
节流函数原理:
规定在一个单位时间内,只能触发—次函数。如果这个单位时间内触发多次函数,只有一次生效。防抖是延迟执行,而节流是间隔执行,函数节流即每隔一段时间就执行一次。
适用场景:
1.拖拽场景:固定时间内只执行一次,防止超高频次触发位置变动
⒉ 缩放场景:监控浏览器 resize
3.动画场景:避免短时间内多次触发动画引起性能问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| // 手写简化版实现
// ①定时器实现
const throttle = (fn,delay = 500) =>{
let flag = true;
return (...args) => {
if(!flag) return;
flag = false;
setTimeout(() => {
fn.apply(this,args);
flag = true;
},delay);
};
}
// ②时间戳实现
const throttle = (fn,delay = 500) => {
let preTime = Date.now();
return (...args) => {
const nowTime = Date.now();
if(nowTime - preTime >= delay){
preTime = Date.now();
fn.apply(this,args);
}
}
}
|