手写一个防抖和节流函数

一. 封装代码(防抖)

 let btn = document.getElementById('btn');
       function submit() {
           console.log('submit1234444')
       }
        function debounce(fn,delayTime,trggleNow = false) {
            let t = null;
            return function() {
                if(t) {
                    clearTimeout(t)
                }
                if(trggleNow) {
                    let firstTriggle = !t;
                    if(firstTriggle) {
                        fn.apply(this)
                        t = setTimeout(() => {
                            t = null
                        },delayTime)
                    } else {
                        t = setTimeout(() => {
                            fn.apply(this)
                            t = null
                    },delayTime)
                    }
                } else {
                  t = setTimeout(() => {
                        fn.apply(this);
                  },delayTime)
                }
            }
        }
        btn.addEventListener('click',debounce(submit,1000,true))

封装思路:

  1. setTimout可以将短时间内点击,汇聚成一次点击;
  2. 防抖函数的调用,其实质是调用return function()这个函数,根据谁调用,this指向谁的原则,所以需要用apply改变this指向。
  3. t= null,用到了闭包,在代码调中做初始化使用,好处是在函数外部可以使用并改变t这个变量值。
  4. 有些场景,比如接口请求中,我们可能需要第一次立即执行,所以给了一个参数判断是否需要立即执行,满足多场景使用
  5. clearTimeOut(t),用于清除之前的计数器,但是不意味着清除后t就变成了null

二. 封装代码(节流)

function throttle(fn,delayTime) {
            let pre = 0;
            return function() {
                let cur = Date.now();
                if(cur - pre > delayTime) {
                    fn.apply(this)
                    pre = cur
                }
            }
}

封装思路:

  1. 基本原理和防抖类似。不同的是,采用时间的比较代替了setTimeout;
  2. 节流函数在规定的时间范围会完成首次执行,且只有一次操作。
  3. 和防抖函数对比:执行调用的依赖不同,防抖是从用户操作层面,比如点击按钮,只会执行最后一次的点击,而节流是从时间层面,在规定的延迟时间内,无论用户怎么操作,都会执行一次。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值