美文网首页
节流与防抖函数的实现

节流与防抖函数的实现

作者: 是素净呀丶 | 来源:发表于2018-08-08 09:26 被阅读0次

1.防抖

一个事件频繁触发时 通过setTimeout延迟执行将handler延后 再次触发时则清空timer
使得当事件连续触发时间间隔在times内 则只执行一次, 具体如下:

// options.head 首次触发是否执行
// options.tail 末次触发是否执行
const debounce  = (fn, times = 1000, context, options = { head: false, tail: true }) => {
  let timer = null;
  let isFirst = true;

  return (...args) => {
    clearTimeout(timer);
   
    if (options.head && isFirst) {
      fn.apply(context || this, args);
      isFirst = false;
    }
    
    timer = setTimeout(() => {
      if (options.tail) {
        fn.apply(context || this, args);
      }
      isFirst = true;
    }, times);
  };
};

2.节流

事件开始之前设置一个开始时间 在触发的时候将当前时间与之对比 如果达到 则执行 并将开始时间(上次执行时间)重置为当前时间 否则 延迟触发 但在每次触发时需清除timer 使得最后一次触发必将执行
使得当事件连续触发 间隔固定时间执行一次

  // options.head 首次触发是否执行
  // options.tail 末次触发是否执行
  const throttle = (fn, times = 1000, context, options = { head: false, tail: true }) => {
    let timer = null;
    let _timer = null;
    let startTime = 0;
    let isFirst = true;
    
    return (...args) => {
      const crtTime = +new Date();
      if (startTime === 0) {
        startTime = +new Date();
      }
      clearTimeout(timer);
      clearTimeout(_timer);      

      if (options.head && isFirst) {
        fn.apply(context || this, args);
        isFirst = false;
      }

      if (crtTime - startTime >= times && startTime !== 0) {
        fn.apply(context || this, args);
        startTime = crtTime;
      } else {
        if (options.tail) {
          timer = setTimeout(() => {
            fn.apply(context || this, args);
          }, times - (crtTime - startTime));
        }
      }

      _timer = setTimeout(() => {
        isFirst = true;
        startTime = 0;
      }, times);
    };
  };

3.总结

需要在触发事件的最后一次中将isFirst重置为true。实际上节流函数结合了防抖函数,节流函数的最后一次触发即防抖函数的基本实现。

纯属自我yy实现,如果不妥,忘指正,不胜感激。

相关文章

网友评论

      本文标题:节流与防抖函数的实现

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