从零开始学JavaScript-----防抖和节流(debounce和throttle)

防抖:事件在函数执行过程中只执行了一次

防抖分为两种:立即执行和非立即执行

立即执行:事件一触发就执行一次,在函数执行的时间段,不在触发事件,如果触发,这个时间段无效

非立即执行:事件触发后,在函数最后的时间执行一次

防抖(使用了闭包和定时器)

防抖的缺点:事件在不断被触发的时间段里,函数不会执行

下面是一段防抖的代码

 <h1>0</h1>
    <script>
        let h1 = document.querySelector('h1');
        let n = 0;
        function fn() {
            n++;
            h1.innerText = n;
        }

        function debounce(fun, wait, ele) {
            let timer//引用闭包防止全局污染
            if (ele) {
                     //立即执行
                return function () {
                    let flag = !timer
                    if (timer) {
                        clearTimeout(timer)
                    }
                    timer = setTimeout(function () {
                        timer = null
                    }, wait)
                    if (flag) {
                        fun()
                    }
                }
            } else {
                非立即执行
                return function () {
                    if (timer) {
                        clearTimeout(timer)
                    }
                    timer = setTimeout(fun, wait)
                }
            }
        }

        let v = debounce(fn, 1000, true)
        document.onmousemove = v;

节流:节流是在函数执行过程中只执行一次

节流也分为立即执行和非立即执行

立即执行(用的时间戳方式)

非立即执行(用的定时器方式)

节流的立即执行:事件一触发就发生变化,然后每隔一段时间发生变化

节流的非立即执行:事件触发后函数执行最后一次发生变化,每隔一段时间发生变化

节流的缺点:事件不断被触发的过程中,在指定的时间间隔内,执行一次函数

下面是一段节流的代码

 <h1>0</h1>

    <script>
        var h1 = document.querySelector('h1');
        var n = 0;
        function fn() {
            n++;
            h1.innerText = n;
        }

        // 节流throttle
        // 节流,就是指连续触发事件但是在 n 秒中只执行一次函数。节流会稀释函数的执行频率。可以通过时间戳、定时器两种方式实现。

        // 时间戳方式(立即执行)
        // 事件会立即执行,并且间隔 1 秒执行 1 次
        function throttle(fun, wait) {
            var prev = 0;
            return function () {
                var now = Date.now(); // 当前的时间戳
                if (now - prev > wait) {
                    fun();
                    prev = now;
                }
            }
        }
        var v = throttle(fn, 1000);
        document.onmousemove = v;

        // -----------------------------------
        // 定时器方式(延迟执行)
        // 事件会1秒后执行,并且间隔 1 秒执行 1 次
        function throttle(fun, wait) {
            var timer;
            return function () {
                if (!timer) {
                    timer = setTimeout(function () {
                        fun();
                        timer = null;
                    }, wait)
                }
            }
        }
        var v = throttle(fn, 1000);
        document.onmousemove = v;
    </script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值