节流和防抖是较为相似的概念,本文先从概念上理解,然后探讨其应用场景,最后实现这两个函数。

节流

1. 概念

用户的方法在某个时间段只执行一次,即每指定时间内最多只调用一个函数。
用一个自身理解的例子来说就是:建造水坝在河道中,我们不能让水不能流动,而是只能让水流动慢一些。

2. 应用场景

  1. 搜索框输入时的实时联想
  2. 监听 scroll 事件计算位置信息

    3. 流程图

    节流函数和防抖函数 - 图1

    4. 代码实现

    1. function throttle(func, wait) {
    2. let lastTime = 0; // 上一次执行时间
    3. let time = null; // 定时器
    4. return function () {
    5. if (time) {
    6. clearTimeout(time); // 清除定时器
    7. time = null;
    8. }
    9. let self = this;
    10. let args = arguments;
    11. let nowTime = +new Date();
    12. const remainWaitTime = wait - (nowTime - lastTime); // 剩余等待执行时间
    13. if (remainWaitTime <= 0) {
    14. // 更新执行时间,执行函数
    15. lastTime = nowTime;
    16. func.apply(self, args);
    17. } else {
    18. // 在剩余执行时间过后,更新时间,执行函数,重置定时器
    19. timer = setTimeout(function () {
    20. lastTime = +new Date();
    21. func.apply(self, args);
    22. timer = null;
    23. }, remainWaitTime);
    24. }
    25. };
    26. }

    防抖

    1. 概念

    在某个事件内的N个动作会被忽略,只有事件后由程序触发的动作是有效的。直白一点的话,就是自最近一次触发后延迟指定时间调用函数。
    用一个自身理解的例子就是:我正在抖腿,等到不抖腿了才会行走。

    2. 应用场景

  3. input输入框架的格式验证

  4. 提交按钮的点击事件

    3. 流程图

    节流函数和防抖函数 - 图2

    4. 代码实现

    1. function debounce(func, wait) {
    2. let time = null;
    3. return function() {
    4. if (time) {
    5. clearTimeout(time); // 清除定时器
    6. time = null;
    7. }
    8. let self = this;
    9. let args = arguments;
    10. time = setTimeout(function () {
    11. func.apply(self, args); // 执行函数
    12. time = null;
    13. }, wait);
    14. }
    15. }