Q4:函数的防抖动和节流

防抖

将几次操作合并为一次操作进行。原理是维护一个计时器,规定时间t内触发函数,但是在时间t内再次触发的时候,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

1
2
3
4
5
6
7
8
9
10
11
function debounce(fn, t) {
let delay = null
return function() {
let _this = this
let args = arguments
clearTimeout(delay)
delay = setTimeout(function() {
fn.apply(_this, args)
}, t)
}
}

节流

一定时间范围内只触发一次函数。和防抖动最大的区别就是,节流函数不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数。而防抖动只是在最后一次时间后才触发一次函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function throttle(fn, t) {
let delay = null
let startTime = Date.parse(new Date)
return function() {
let _this = this
let args = arguments
let curTime = Date.parse(new Date)
let time = t - (curTime - startTime)
clearTimeout(delay)
if (time <= 0) {
fn.apply(_this, args)
startTime = Date.parse(new Date)
} else {
delay = setTimeout(fn, time)
}
}
}