浅谈Debounce 与 Throttle
throttle
是开发中常用的高阶函数,作用都是为了防止函数被高频调用,换句话说就是,用来控制某个函数在一定时间内执行多少次。debounce
或throttle
了。debounce
与throttle
两个函数的作用相同,且调用方法和参数都相同,这让我们很容易弄混。今天就来谈谈debounce
和throttle
的用法与差异。lodash
中的_.debounce()
与_.throttle()
。_.debounce(func, [wait=0], [options={}])
_.throttle(func, [wait=0], [options={}])
_.debounce(func, [wait=0], [options={}])
function debounce(fn, wait, options) {
wait = wait || 0;
var timerId;
function debounced() {
if (timerId) {
clearTimeout(timerId);
timerId = null;
}
timerId = setTimeout(function() {
fn();
}, wait);
}
return debounced;
}
debounce
函数中定义了一个debounced()
函数,内部定义了一个定时器,每当触发事件时,都会重置定时器,也就是说,当事件被执行时,并不会立刻执行fn,而是等待一定时间(wait)后才会执行。如果wait过后,函数没有再次被执行,就会处理最后一个fn。_.throttle(func, [wait=0], [options={}])
deboucne
不同的是,throttle
会有一个阀值,当到达阀值时,fn一定会执行。function throttle(fn, wait, options) {
wait = wait || 0;
var timerId, lastTime = 0;
function throttled() {
var currentTime = new Date();
if (currentTime >= lastTime + wait) {
fn();
lastTime = currentTime;
} else {
if (timerId) {
clearTimeout(timerId);
timerId = null;
}
timerId = setTimeout(function() {
fn()
}, wait);
}
}
return throttled;
}
debounce
:将触发频繁的事件合并成一次执行。debounce
适用于诸如input事件,当用户输入时需要响应ajax请求,多次input只响应一次回调方法throttle
: 设置一个阀值,在阀值内,将触发的事件合并成一次执行;且当到达阀值,必定执行一次事件。throttle
适用于resize或者鼠标移动事件,防止浏览器频繁响应事件,严重拉低性能