防抖和节流原理以及实现⽅法
羊肚汤
何谓节流和防抖?
节流
节流的意思是,规定时间内,只触发⼀次。⽐如我们设定500ms,在这个时间内,⽆论点击按钮多少次,它都只会触发⼀次。具体场景可以是抢购时候,由于有⽆数⼈快速点击按钮,如果每次点击都发送请求,就会给服务器造成巨⼤的压⼒,但是我们进⾏节流后,就会⼤⼤减少请求的次数。
防抖
防抖的意思是,在连续的操作中,⽆论进⾏了多长时间,只有某⼀次的操作后在指定的时间内没有再操作,这⼀次才被判定有效。具体场景可以搜索框输⼊关键字过程中实时请求服务器匹配搜索结果,如果不进⾏处理,那么就是输⼊框内容⼀直变化,导致⼀直发送请求。如果进⾏防抖处理,结果就是当我们输⼊内容完成后,⼀定时间(⽐如500ms)没有再输⼊内容,这时再触发请求。
结合以上两种情况,回到我们最实际的场景,⽐如防⽌表单提交按钮被多次触发,我们应该选择使⽤节流⽽不是防抖⽅案。
防抖debounceTail
只执⾏⾸次
// 防抖且⾸次执⾏
贵州游玩// 采⽤原理:第⼀操作触发,连续操作时,最后⼀次操作打开任务开关(并⾮执⾏任务),任务将在下⼀次操作时触发)
function debounceStart(fn, delay, ctx) {
let immediate = true
纤悉let movement = null
return function() {
let args = arguments
// 开关打开时,执⾏任务
if (immediate) {
fn.apply(ctx, args)
immediate = fal
}
// 清空上⼀次操作
clearTimeout(movement)
// 任务开关打开
movement = tTimeout(function() {
immediate = true
}, delay)咖啡鼠
}
}
只执⾏最后⼀次
佐贺的超级阿嬷读后感/
/ 防抖尾部执⾏
// 采⽤原理:连续操作时,上次设置的tTimeout被clear掉
function debounceTail(fn, delay, ctx) {
let movement = null
return function() {
let args = arguments
// 清空上⼀次操作
clearTimeout(movement)
// delay时间之后,任务执⾏
movement = tTimeout(function() {
fn.apply(ctx, args)
}, delay)
}
}
节流函数throttle
// 节流⽅案1,每delay的时间执⾏⼀次,通过开关控制
function throttle(fn, delay, ctx) {
let isAvail = true
return function () {
let args = arguments // 开关打开时,执⾏任务
if (isAvail) {
fn.apply(ctx, args)绝对价值
isAvail = fal// delay时间之后,任务开关打开
tTimeout(function () { isAvail = true }, delay)
}
}
}
// 节流⽅案2,通过计算开始和结束时间
function throttle(fn,delay){
// 记录上⼀次函数出发的时间
var lastTime = 0
return function(){
// 记录当前函数触发的时间
gateway笔记本
var nowTime = new Date().getTime()
// 当当前时间减去上⼀次执⾏时间⼤于这个指定间隔时间才让他触发这个函数if(nowTime - lastTime > delay){
// 绑定this指向
fn.call(this)
//同步时间
lastTime = nowTime
}
}
}
屏风的作用详见 “” 部分右边⽤例狂点⼏下就明⽩了