防抖和节流


前言

防抖和节流都是为了优化页面性能,避免因频繁触发函数而导致的性能浪费以及不必要的网络请求。二者的原理和应用略有不同。


一、防抖函数

1.1什么是防抖

防抖(debounce)的基本思路是:如果短时间内连续触发同一个函数,那么只执行最后一次操作,以达到稳定的效果

1.2使用场景

例如:当用户在搜索框中输入关键字的过程中,我们希望最终只查询一次,而不是每输入一个字符就查询一次,这时候我们就可以运用防抖函数来避免被频繁地调

  • 输入框输入验证
  • 鼠标拖拽事件
  • 窗口大小改变事件
  • 按钮提交事件

1.3实现思路-代码实现

防抖的实现思路是:设置一个延迟函数,当触发事件,如果在设置的时间内再次触发事件,则清楚延迟函数并重新设定一个新的延迟函数,直到一定时间内没有再次触发事件,再执行函数

	    /***
     * fn:需要进行设置防抖的函数
     * delay:需要设置的时间间隔
    */
    function debounce (fn, delay) {
        let timer = null;
        return function () {
            let context = this,
                args = arguments;
            clearTimeout(timer);
            timer = setTimeout(function () {
                fn.apply(context, args);
            }, delay);
        };
    }

二、节流函数

2.1什么是节流

节流(throttle)的基本思路是:如果短时间内连续触发同一个函数,那么只执行一次操作,后续操作将被忽略一段时间

2.2使用场景

例如:在用户滚动页面的过程中,我们希望在一段时间内只执行一次页面元素的加载函数,而不是每次滚动斗加载一次.这时我们就可以运用节流避免该函数被频繁地调用

  • 页面滚动事件
  • 鼠标移动事件
  • 按钮点击事件

2.3 实现思路-代码实现

节流地实现思路:设置一个时间戳,当触发事件时,如果当前时间和时间戳之间差值大于设置地时间间隔,则执行函数并更新时间戳为当前时间

    /***
     * fn:需要进行设置节流的函数
     * delay:需要设置的时间间隔
    */
    function throttle (fn, delay) {
        let timer = null,
            lastTime = 0;
        return function () {
            let context = this,
                args = arguments,
                now = new Date().getTime();
            if (now - lastTime - delay > 0) {
                if (timer) {
                    clearTimeout(timer);
                    timer = null;
                }
                lastTime = now;
                fn.apply(context, args);
            } else if (!timer) {
                timer = setTimeout(function () {
                    lastTime = new Date().getTime();
                    timer = null;
                    fn.apply(context, args);
                }, delay);
            }
        };
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值