防抖(debounce)
- 触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次触发,则重新计算时间。
- 举例:常用的一个场景,输入框的搜索,每次输入之后弹出联想词,这个控制联想词的方法就不可能是输入框内容一改变就触发的,他一定是当你结束输入一段时间之后才触发的。
function debounce(fn,delay){
let timer = null
return function() {
if(timer){
clearTimeout(timer)
}
timer = setTimeout(fn,delay)
}
}
function showTop () {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
console.log('滚动条位置:' + scrollTop);
}
window.onscroll = debounce(showTop,1000)
节流(thorttle)
- 高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率
- 举例:预定一个函数只有在大于等于执行周期时才执行,周期内调用不执行。就好像你在淘宝抢购某一件限量热卖商品时,你不断点刷新点购买,可是总有一段时间你点上是没有效果,这里就用到了节流,就是怕点的太快导致系统出现bug
function throttle(fn,delay){
let valid = true
return function() {
if(!valid){
return false
}
valid = false
setTimeout(() => {
fn()
valid = true;
}, delay)
}
}
function showTop () {
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
console.log('滚动条位置:' + scrollTop);
}
window.onscroll = throttle(showTop,1000)
区别
- 防抖动是将多次执行变为最后一次执行,节流是将多次执行变成没隔一段时间执行。