# 函数节流 throttle
指定时间间隔内只会执行一次任务
常用于滚动条滚动监听等
function throttle(fn, timehold) {
let startTime = new Date().getTime();
const context = this;
return function() {
const currentTime = new Date().getTime();
if (currentTime - startTime >= timehold) {
fn.apply(context, [...arguments]);
startTime = currentTime;
}
};
}
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
# 函数防抖 debounce
任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行
即:用户在不触发事件时,才触发相应动作,以抑制本来在事件中要执行的动作。
常用于用户输入验证等
function debounce(fn, waitTime) {
let timeout;
return function() {
clearTimeout(timeout);
const args = arguments;
timeout = setTimeout(() => {
fn.apply(this, [...args]);
}, waitTime);
};
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
/**
* @param {Function} func
* @param {number} wait
* @param {boolean} immediate
* @return {*}
*/
export function debounce(func, wait, immediate) {
let timeout, args, context, timestamp, result
const later = function() {
// 据上一次触发时间间隔
const last = +new Date() - timestamp
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
if (last < wait && last > 0) {
timeout = setTimeout(later, wait - last)
} else {
timeout = null
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
if (!immediate) {
result = func.apply(context, args)
if (!timeout) context = args = null
}
}
}
return function(...args) {
context = this
timestamp = +new Date()
const callNow = immediate && !timeout
// 如果延时不存在,重新设定延时
if (!timeout) timeout = setTimeout(later, wait)
if (callNow) {
result = func.apply(context, args)
context = args = null
}
return result
}
}
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
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