0%

介绍防抖与节流的原理,并动手实现

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);

}

}

}