- 防抖
定义: 在定义的时间内只执行一次, 且延迟执行
例如: 定义时间2s, 在10s内连续一直点击, 则在第12秒执行函数
拓展: 首次正常执行, 后续延迟执行
下例: 点击事件, 首次生效, 后续点击在1秒内最后一次点击生效
/*
代码解释:
注册 debounce 函数, 定义 t 变量;
首次点击时, 赋值定时器的返回值t;
2s内再次点击时, 清除上一次定时器的执行函数, 并且再次注册新的定时器
后续2s内点击依次清除前一次的执行, 只执行最后一次点击的函数, 从而实现延迟2s的效果
*/
var debounce = function(func, wait) {
var t;
return function() {
var nfunc = () => func(...arguments);
t ? clearTimeout(t) : nfunc(); // 拓展: 首次执行 nfunc();
t = setTimeout(t ? nfunc : () => 0, wait);
}
}
var click1 = debounce(function(e, v) {
console.log('values: ', e, v)
}, 1000)
- 节流
定义: 定义一个时间, 连续触发事件只能在定义的时间内执行一次
例如: 定义时间2s, 在10s内连续一直点击, 则实际触发5次
/*
代码解释:
注册 throttle 函数, 定义 t 变量;
首次点击执行定时器, 进入计时, 2s后执行func函数;
后续2s内的多次点击均被if条件判断为false, 取消函数执行;
2s后执行func函数, t设置null, 再次点击进入新的定时, 从而实现2s内多次触发执行一次的效果
*/
const throttle = function(func, wait){
var t;
return function(){
if(t) return;
t = setTimeout(()=>{
func(...arguments);
t = null;
}, wait)
}
}
var click2 = throttle(function(e, v) {
console.log('values: ', e, v)
}, 2000)