js的防抖和节流

防抖和节流概念

防抖和节流都是性能优化的方式 : 针对的是高频触发的事件: 比如 滚动事件scroll, 用户输入事件 input

函数防抖
debounce:用户一直触发事件,事件处理函数是不会执行的,直到用户在指定的时间内不在触发该事件,则执行一次事件处理程序(防抖意味着事件处理程序只会执行性一次)

函数节流 throttle:用户一直触发事件,事件处理函数会每间隔指定的时间后执行一次, 在指定的时间内不会反复执行;(节流意味着事件处理程序每间隔指定的时间执行一次)

防抖和节流的区别:防抖是将多次执行变为最后一次执行,节流是将多次执行变为每隔一段时间执行

防抖和节流的实现方式: 计时器和时间戳 (为了防止变量污染,通过闭包的形式实现功能)

参考网址: https://www.cnblogs.com/youma/p/10559331.html

防抖实现(计时器实现)

    function debounce(fn, delay) { //fn就是真正事件处理的函数/delay是时间
        // 提前声明一个计时器, 赋值为null
        let timer = null;
        return function() {
        //最初想法
            // if (!timer) {
            //     timer = setTimeout(fn, delay)
            // } else {
            //     clearTimeout(timer);
            //     timer = setTimeout(fn, delay)
            // }
            //精简版  防抖: 关键点在于清除计时器的节点
             if (timer) {
                 clearTimeout(timer);
             }
             timer = setTimeout(fn, delay)

            // 考虑到this指向和传参的问题
            //let that = this;
           // let args = arguments;
           // if (timer) {
           //     clearTimeout(timer);
           // }
           // timer = setTimeout(function() {
           //     fn.apply(that, args)
          //  }, delay)
        }
    }
    //  真正的时间处理程序
    function print() {
        console.log('hello world');
    }
    window.onscroll = debounce(print, 2000);
    //当滚动的时候,调用一个函数
</script>

js 点击按钮的防抖

节流实现(时间戳实现)

 <script>
    //这个节流函数利用时间戳让第一次滚动事件执行一次回调函数,此后每隔1000ms执行一次,
    //在小于1000ms这段时间内的滚动是不执行的
    //  节流函数  时间戳
    function throttle(fn, delay) {
        //  起点的时间
        let start = Date.now();
        return function() {
            //  获取当前时间,通过 当前时间 - 起点时间 =  时间差,
            // 判断 时间差和 delay的关
            var now = Date.now();
            if (now - start >= delay) {
                print()
            //  事件处理程序执行一次后,需要重新计时
                start = Date.now();
            }
        }
    }
    //  真正的事件处理程序
    function print() {
        console.log('节流');
    }
    window.onscroll = throttle(print, 1000);
</script>

如果要传参,改变this的指向

<script>
        //  节流函数  时间戳
        function throttle(fn, delay) {
            //  起点的时间
            let start = Date.now();
            return function() {
                let that = this; //this指向window
                let args = arguments;
                //  获取当前时间,通过 当前时间 - 起点时间 =  时间差,
                // 判断 时间差和 delay的关系
                let diff = Date.now() - start
                if (diff > delay) {
                    fn.apply(this, arguments)
                //  事件处理程序执行一次后,需要重新计时,所以获取现在的时间
                    start = Date.now();
                }
            }
        }
        //  真正的事件处理程序
        function print() {
            console.log('节流');
        }
        window.onscroll = throttle(print, 1000);
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值