众所周知,函数节流和函数防抖都是优化高频率执行js代码的一种方法,二者的区别及使用方法如下:
函数节流
函数防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n 秒内又触发了事件,则会重新计算函数执行时间。
export const Debounce = function(func, wait, immediate) {
let timeout, result;
return function() {
let context = this, args = arguments;
let later = function() {
timeout = null;
if (!immediate) result = func.apply(context, args);
};
let callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) result = func.apply(context, args);
return result;
};
};
函数防抖
函数节流,就是指限制函数在一段时间内只执行一次
export const Throttle = function(func, wait) {
let context, args, timeout, result;
let previous = 0;
let later = function() {
previous = new Date;
timeout = null;
result = func.apply(context, args);
};
return function() {
let now = new Date;
let remaining = wait - (now - previous);
context = this;
args = arguments;
if (remaining <= 0) {
clearTimeout(timeout);
timeout = null;
previous = now;
result = func.apply(context, args);
} else if (!timeout) {
timeout = setTimeout(later, remaining);
}
return result;
};
};
异同点
一、相同:
1、都可以降低函数的调用频率,一定程度上可以提高性能;
2、都可以用定时器实现;
二、不同:
假定设置节流/防抖时间间隔为1S:
1、函数节流:
- 在用户连续操作的时间内,每隔一秒钟就会调用一次函数;
- 函数调用时机:在用户某个操作时段的开始的时刻;
2、函数防抖:
- 在用户连续操作的时间内,只有两次调用的时间间隔大于1S时会调用一次,若未到1S时再一次触发,则清空计时器,重新计时,直到间隔大于1S的时候才会调用一次;
- 函数调用时机:在用户某个连续操作时段结束后+需要延迟的时间 的时刻;
网友评论