为什么要有这个概念?为了性能!!!
都是减少了函数执行的频率
事件触发之后,在一定的时间间隔内,该事件只触发一次。
如果在该事件间隔内再次触发,则重新设置该时间间隔。
onresize,scroll,mousemove ,mousehover ,keyup等会短时间内多次触发(频繁触发);
例如点击按钮执行ajax保存数据,如果不做处理,连续点击,会保存多次;
不做限制的话可能一秒执行几百次;
如下代码,最终只会在控制台输出一个时间戳
function myDebounce (callback,delay = 200) {
var timer = null;
return function (){
if(timer){
clearTimeout(timer);
}
timer = setTimeout(function(){
callback()
},delay);
}
}
var testFn = myDebounce(function(){
console.log(Date.now());
},10)
var num = 100000
while(num){
testFn();
num--;
}
事件触发之后,保障在一定时间内,只调用一次该事件处理函数。
如:resize中,我们要重新设置一个div的高度。如果采用防抖,那么只会在最后一次执行,在resize过程中,不会执行,会导致用户看起来div卡了一会。
如果使用节流,那么在用户resize过程中,div的高度也会随之变化,但是又不用密集去改变,节省一定的性能。
如下代码,最终只会在控制台输出2-3时间戳
function myThrottle (callback,delay = 200) {
var timer = new Date();
return function (){
var current = new Date();
if(current - timer > delay){
callback();
timer = current;
}
}
}
var testFn = myThrottle(function(){
console.log(Date.now());
},10)
var num = 100000
while(num){
testFn();
num--;
}
防抖:是n秒内只执行一次,如果触发事件后在 n 秒内又触发了事件,则会重新计算函数延执行时间。
节流:是间隔时间执行,不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数。