手写实现节流防抖,就这?

防抖函数

参考掘金文章

作用:频繁触发,第一次与不触发的时候执行函数

节流函数(throttle)

作用:在某一个时间内函数只被执行已

使用场景:当一个函数被频繁执行,而你希望它只是在某个时间段内只执行一次,这时候你就可以用节流函数了,如滚动监听,窗口resize,这些执行频繁的函数

实现代码:

function throttle(fn,delay){
  let flag = true // 是否已有定时器
  let timer = null 
  return function(...args){
    if(!flag) return
    flag = false
    let _this = this
    clearTimeout(timer) // 清除
    timer = setTimeout(()=>{
      fn.apply(_this,args)
      flag = true
    },delay)
  }
}
// 使用
let throttleFunc = throttle(scrollEvent, 300)
document.addEventListener("scroll", function () {
  throttleFunc(123)
})
function scrollEvent(args) {
	console.log("滚动做点啥事" + args + "," + this.a);
}
// 滚动做点啥事123,cao
防抖函数

作用:频繁触发,第一次与不触发的时候执行函数

使用场景:函数频繁执行,但是你希望触发该函数的事件停止之后再去执行该函数,例如,提示搜索框,需要向远程检索关联数据,如果每输入一个字符串就发起一次请求,这时候就可以使用防抖函数了

思想:每次事件触发都会删除原有定时器,建立新的定时器。通俗意思就是反复触发函数,只认最后一次,从最后一次开始计时。

实现代码:

function debounce(fn,delay){
  let timer = null
  return function(...arg){
    if(timer) clearTimeout(timer)
    let _this = this
    timer = setTimeout(()=>{
      fn.apply(_this,args)
    },delay)
  }
}
// 使用
let debounceFunc = debounce(scrollEvent, 300)
document.getElementById("my_input").addEventListener("keydown", function () {
      debounceFunc(456)
})
function scrollEvent(args) {
  console.log("滚动做点啥事" + args + "," + this.a);
}
适用场景

防抖

  • search搜索,用户不断输入值时,用防抖来节约Ajax请求,也就是输入框事件。
  • window触发resize时,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

节流

  • 鼠标的点击事件,比如mousedown只触发一次
  • 监听滚动事件,比如是否滑到底部自动加载更多,用throttle判断
  • 比如游戏中发射子弹的频率(1秒发射一颗)

转载自https://zhuanlan.zhihu.com/p/38313717

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值