1、什么是防抖函数?
防抖函数的作用是当短期内有大量的事件触发时,只会执行最后一次事件关联的任务。
debounce(fn){
let timeout = null; // 定时器id
return function() {
clearTimeout(timeout); // 清除旧的定时器
timeout = setTimeout(() => {
fn.apply(this, arguments); // 执行fn
}, 500)
}
}
观察上面防抖函数的代码逻辑:
定义一个防抖函数,返回一个匿名函数(闭包),传入需要执行的事件fn
,定义一个定时器,规定500ms后执行当前事件fn
;根据防抖的作用:只会执行最后一次事件关联的任务;也就是说在500ms内,如果重复触发了定时器任务,那在旧的timeout尚未执行时就被清理掉了clearTimeout(timeout)
,而且500ms内只允许有一个timeout等待执行。
举个例子:
2、应用场景
什么是节流函数?
节流函数的作用是当短期内有大量的事件被触发时,只会执行第一次触发的事件
throttle(fn){
let timeout = null; // 定时器id
return function(){
if (timeout) return; // 如果id为空,不执行以下逻辑
timeout = setTimeout(() => {
fn.apply(this, arguments); // 执行fn
timeout = null; // 将定时器id设置为null,以便下次触发事件时重新启用定时器
}, 500)
}
}
观察节流函数的代码逻辑:
此函数的原理为当每次事件触发时,先判断与该事件关联的任务是否正在等待执行。如果不是,那么就创建一个timeout,让任务等待执行。再有新事件触发时,如果发现有任务正在等待,就直接退出。
举个例子:
2、应用场景