# ❓什么是防抖和节流?有什么区别?如何实现?
这里我们用一个表格去解答这道题我觉得更加的直观,并且令人记忆深刻。
函数 | 定义 | 🌰 |
---|---|---|
防抖(debounce) | 规定时间内只会触发一次函数运行,如果再次触发则重置时间 | input 搜索框不断输入,只有等 300ms 内不输入才会自动执行搜索函数 |
节流(throttle) | 无论触发多少次一段时间只触发一次函数运行 | 按钮 300ms 内重复点击多次,但就执行第一次 |
// 防抖
// 函数的内部定义定时器,每次触发清除之前定时任务,并且开始新的定时任务
function debounce(func, delay = 300) {
let timer = null; // 创建一个定时器载体变量
return function() {
if (timer) clearTimeout(timer); // 如果当下已经有定时器任务,就清除掉
timer = setTimeout(() => {
func.apply(this, arguments); // 为了确保这里的this能指向调用者,所以用apply
}, delay);
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
// 节流
// 函数内部设置开关,第一次调用关闭开关,执行函数,在函数执行之后重置开关
function throttle(func, delay = 300) {
let flag = true; // 创建一个标识开关
return function() {
if (flag) {
flag = false; // 第一次进来关闭flag,让之后的触发都进不来
// 节流函数一般都是第一次不做delay
func.apply(this, arguments); // 为了确保这里的this能指向调用者,所以用apply
timer = setTimeout(() => (flag = true), delay); // 重置开关
}
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16