为什么函数防抖要用到闭包?

防抖的标准写法为:

            function debounce(fn, delay){
                let timer = null;
                return function(){
                    if(timer){
                        clearTimeout(timer)
                        timer = setTimeOut(fn, delay)
                    }else{
                        timer = setTimeOut(fn, delay)
                    }
                }
            }

为什么要将timer放入函数内部?

timer作为全局变量放在函数外面也是可以的,但是只限于用于一个业务。如果debounce被不同的业务使用,这些业务将会一起操作timer,完全乱套。

为什么要用闭包?

为什么不能这样写呢?

            function debounce(fn, delay){
                let timer = null;
                if(timer){
                    clearTimeout(timer)
                    timer = setTimeOut(fn, delay)
                }else{
                    timer = setTimeOut(fn, delay)
                }
            }
document.getElementById("div1").οnmοuseοver =
 debounce(function(){alert("fuckoff")}, 500)

首先知道闭包的有一个作用就是可以使父级函数的内部环境在变量中一直存在。参考这个
比如有个业务使用了debounce函数,用闭包后,对于该业务,timer将会一直存在,如果不用闭包,每次触发将会生成一个新的time,if (timer)将永远不会被触发。
如果此时又有一个业务使用了debounce,用闭包的情况下,会为这个新的业务生成一个新的timer。
解释完毕。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值