美文网首页
函数节流(throttle)与函数去抖(deboun

函数节流(throttle)与函数去抖(deboun

作者: Max_Law | 来源:发表于2024-01-20 13:17 被阅读0次

函数节流(throttle)与函数去抖(debounce)是两种优化高频事件处理函数调用的策略,常用于浏览器环境以避免因短时间内大量函数调用导致的性能问题,例如窗口大小变化、滚动事件、输入框连续输入等场景。

1. 函数节流(Throttle):

  • 概念:在一定时间内,只允许一个函数执行一次。若在这段时间内多次触发该函数,则只有第一次生效,直到过了这个时间段,才会重新生效。

  • 场景举例:监听窗口滚动事件时,我们并不需要实时获取滚动位置,而是希望在滚动停止或每过一段时间后才执行回调函数,减少计算量和渲染频率。

  • 实现方法:

    function throttle(fn, delay) {
      let timer = null;
      let startTime = Date.now();
    
      return function () {
        const curTime = Date.now();
        const remaining = delay - (curTime - startTime);
    
        clearTimeout(timer);
    
        if (remaining <= 0) {
          fn.apply(this, arguments);
          startTime = Date.now();
        } else {
          timer = setTimeout(() => {
            fn.apply(this, arguments);
            startTime = Date.now();
          }, remaining);
        }
      };
    }
    
    // 使用示例
    const throttledFn = throttle(someExpensiveFunction, 500);
    window.addEventListener('scroll', throttledFn);
    

2. 函数去抖(Debounce):

  • 概念:在事件被触发后的规定时间段内,如果再次触发事件,则清除当前定时器并重新开始计时。只有当事件触发后的一段时间内没有再次触发事件,才会执行对应的回调函数。

  • 场景举例:在输入框连续输入时,我们不需要对每一次输入都进行实时验证或搜索,而是在用户停止输入一段时间后再执行操作,提高用户体验及性能。

  • 实现方法:

    function debounce(fn, delay) {
      let timer = null;
    
      return function () {
        clearTimeout(timer);
        timer = setTimeout(() => {
          fn.apply(this, arguments);
        }, delay);
      };
    }
    
    // 使用示例
    const debouncedFn = debounce(someExpensiveFunction, 300);
    inputElement.addEventListener('input', debouncedFn);
    

总结:函数节流关注的是在单位时间内只执行一次,而函数去抖更关心的是相邻两次调用的时间间隔,只有满足这个间隔才会执行。

相关文章

网友评论

      本文标题: 函数节流(throttle)与函数去抖(deboun

      本文链接:https://www.haomeiwen.com/subject/vgtdodtx.html