理清楚防抖和节流

在开发中我们经常会遇见一些频繁触发的事件,比如resize、scroll、mousemove等。那如果这些事件是复杂的回调函数或是数据请求,连续的被触发之后,浏览器反应不过来,就会出现卡顿的现象,为了解决这个问题,就出现了两种解决方案:防抖(debounce)和 节流(throttle)

防抖(debounce)

原理:触发高频事件后n秒内,函数只会执行一次,如果在一个事件触发的n秒内再次触发这个事件,那会以新的触发时间重新计算。总之,就是在触发完事件的n秒内不再触发事件,才会再执行函数。

实现:

function debounce(fn, wait) {

        var timer = null;

        return function () {

            clearTimeout(timer);

            timer = setTimeout(() => {

                fn.apply(this, arguments);

            }, wait);

        }

    }

若想立即执行并在n秒内取消 debounce 函数的做法(immediate参数判断是否是立刻执行)

function debounce(fn, wait, immediate) {

    var timer, result;

    var debounced = function () {

        if (timer) clearTimeout(timer);

        if (immediate) {

            // 如果已经执行过,不再执行

            var callNow = !timeout;

            timer = setTimeout(() => {

                timer = null;

            }, wait);

            if (callNow) result = func.apply(this, arguments)

        }

        else {

            timer = setTimeout(() => {

                fn.apply(this, arguments);

            }, wait);

        }

        return result;

    };

    debounced.cancel = function() {

        clearTimeout(timer);

        timer = null;

    };

    return debounced;

}

节流(throttle)

原理:持续触发事件,每隔一段时间,只执行一次函数。就是说会稀释函数的执行频率。

实现:关于节流的实现,有两种主流的实现方式,一种是使用时间戳,一种是设置定时器。

使用时间戳:

function throttle(fn, wait) {

      var previous = 0;

      return function () {

          var now = +new Date();

          if (now - previous > wait) {

              fn.apply(this, arguments);

              previous = now;

          }

      }

  }

使用定时器:当事件触发时,设置一个定时器,再次触发事件时,如果定时器存在,就不执行,直到执行定时器,执行函数,清空定时器。

function throttle(fn, wait) {

    var timer;

    var previous = 0;

    return function() {

        if (!timer) {

            timer = setTimeout(() => {

                timer = null;

                fn.apply(this, arguments)

            }, wait)

        }

    }

}

比较以上两种方法:

时间戳方法事件会立刻执行,定时器方法事件会在 n 秒后第一次执行;

时间戳方法事件停止触发后没有办法再执行事件,定时器方法事件停止触发后依然会再执行一次事件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
校园失物招领系统管系统按照操作主体分为管员和用户。管员的功能包括字典管、论坛管、公告信息管、失物招领管、失物认领管、寻物启示管、寻物认领管、用户管、管员管。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管系统可以提高校园失物招领系统信息管问题的解决效率,优化校园失物招领系统信息处流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管员权限操作的功能包括管公告,管校园失物招领系统信息,包括失物招领管,培训管,寻物启事管,薪资管等,可以管公告。 失物招领管界面,管员在失物招领管界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管界面,管员在寻物启事管界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管界面,管员在公告管界面中新增公告,可以删除公告。公告类型管界面,管员在公告类型管界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值