





























触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。 每次触发事件时都取消之前的延时调用方法
常见使用场景是:用户输入,只有在输入完之后才做校验
示例: 滚动结束后才执行一次
function debounce(fun, wait, imediate){
let timer = null
return function(...rest){
if(imediate&&!timer) {
fun.apply(this,rest)
}
if(timer)clearTimeout(timer)
timer = setTimeout(()=>{
fun.apply(this,rest)
}, wait)
}
}
const fun = function(...rest){
console.log(new Date().getTime())
}
window.addEventListener('scroll',debounce(fun,1000,false))
过程:
高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。 每次触发事件时都判断当前是否有等待执行的延时函数
常见使用场景是页面滚动,或者鼠标移动,减少函数调用的频次。
示例: 滚动开始后每间隔1000ms执行一次
// 时间戳版本
function throttle(fun, time){
let last = 0;
return function(...rest){
let now = new Date().getTime();
if(now-last>time){
last = now;
fun.apply(this, rest)
}
}
}
// 定时器版本
function throttle2(fun, time){
let timer = null
return function(...rest){
if(timer)return
timer = setTimeout(()=>{
fun.apply(this, rest)
clearTimeout(timer)
timer = null
}, time)
}
}
const callback = function(...rest){
console.log((new Date().getTime()), rest)
}
window.addEventListener('scroll', throttle(callback, 1000))
过程: 两者均是利用外层函数提供一个变量共内层函数使用; 时间戳版本,通过时间来比较,如果间隔时间内执行过了才重新计时; 定时器版本,通过定时器,如果定时器执行过了才会重新设置定时器;
防抖和节流的主要区别:防抖是一段时间内触发了,就清除定时器重新计时,直到一段时间内没有触发了,才执行回调;而节流是一段时间内触发多次了,只会执行一次回调,并重新计时。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。