防抖和节流

155 阅读1分钟

项目综合经验1.0 - 防抖和节流

1. 函数防抖(debounce):

当持续触发事件时,一定时间段内没有再触发事件,事件处理函数才会执行一次,如果设定的时间到来之前,又一次触发了事件,就重新开始延时

  • 示例:
 debounce(fun, delay = 500) {
      let timer = null;
      return function(...rest) {
        if (timer)
          //每次进入 调用这个函数都会清除上一次 注册的定时器
          clearTimeout(timer);
        timer = setTimeout(() => {
          console.log(666);

          fun.apply(this, rest); // 延时调用
        }, delay);
      };
    }
  • 应用

    有的实际项目中, 可以使用防抖 减少请求数据的频率,减轻 服务器负担

2.函数节流(throttle):

当持续触发事件时,保证一定时间段内只调用一次事件处理函数

  • 示例::

时间戳的形式:

var throttle = function(func, delay) {            
  var prev = Date.now();            
  return function() {                
    var context = this;                
    var args = arguments;                
    var now = Date.now();                
    if (now - prev >= delay) {                    
      func.apply(context, args);                    
      prev = Date.now();                
    }            
  }        
}        

定时器形式):

// 节流throttle代码(定时器):
var throttle = function(func, delay) {            
    var timer = null;            
    return function() {                
        var context = this;               
        var args = arguments;                
        if (!timer) {                    
            timer = setTimeout(function() {                        
                func.apply(context, args);                        
                timer = null;                    
            }, delay);                
        }            
    }        
}        

更简单的就是 设置一个变量,标志事件的完成,在上一个事件完成之前这次事件不会触发,在某一次事件处理函数完成后,更改这个标志变量。