JS面试题之防抖节流(首次立即执行)

今天面试又问到了防抖节流的问题,本来觉着这个题目太easy了,都写烂了,结果面试官说需要首次执行,后来思考了一下实际应用中可能确实需要这个操作。
//简单版  所有操作均延迟
function debounce(fn, delay) {
      let timer = null;
      return function () {
        clearTimeout(timer)  //先清除定时器
        timer = setTimeout(() => {
          fn()}, delay)
        }
      }
    }


//加强版  首次立即执行
  function debounce(fn, delay) {
      let timer = null;
      let count = 0;
      let self = this
      return function () {
        let args= [...arguments] //取出参数
        clearTimeout(timer)  //先清除定时器
        if (!count) {//第一次点击的时候
          count++
          fn.apply(self,args)
          timer = setTimeout(() => {
            count = 0;
          }, delay)
        } else {
          count++
          timer = setTimeout(() => {
           fn.apply(self,args)
            count = 0;
          }, delay)
        }
      }
    }
    
  
//测试
let a = debounce((num) => (console.log(num)), 1000)
    window.onclick = () => {
      a()
}

后记: 大概就是这样,但是最后自己又产生了一些疑问,关于this指向,是不是要再加一个let self = this ,之后fn.call(self,args)呢?有清楚的朋友可以评论区一起交流。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值