节流与防抖

函数防抖:将几次操作合并为一此操作进行。原理是维护一个计时器,规定在delay时间后触发函数,但是在delay时间内再次触发的话,就会取消之前的计时器而重新设置。这样一来,只有最后一次操作能被触发。

函数节流:使得一定时间内只触发一次函数。原理是通过判断是否到达一定时间来触发函数。

防抖代码如下

/**
  *
  * @param fn {Function}   实际要执行的函数
  * @param delay {Number}  延迟时间,也就是阈值,单位是毫秒(ms)
  *
  * @return {Function}     返回一个“去弹跳”了的函数
  */
  function debounce(fn, delay) {

    // 定时器,用来 setTimeout
    var timer

    // 返回一个函数,这个函数会在一个时间区间结束后的 delay 毫秒时执行 fn 函数
    return function () {

      // 保存函数调用时的上下文和参数,传递给 fn
      var context = this
      var args = arguments

      // 每次这个返回的函数被调用,就清除定时器,以保证不执行 fn
      clearTimeout(timer)

      // 当返回的函数被最后一次调用后(也就是用户停止了某个连续的操作),
      // 再过 delay 毫秒就执行 fn
      timer = setTimeout(function () {
        fn.apply(context, args)
      }, delay)
    }
  }

 节流代码如下

// 节流throttle代码(时间戳+定时器):
var throttle = function(func, delay) {     
    var timer = null;     
    var startTime = Date.now();     
    return function() {             
        var curTime = Date.now();             
        var remaining = delay - (curTime - startTime);             
        var context = this;             
        var args = arguments;             
        clearTimeout(timer);              
        if (remaining <= 0) {                    
            func.apply(context, args);                    
            startTime = Date.now();              
        } else {                    
            timer = setTimeout(func, remaining);              
        }      
    }
}
function handle() {      
    console.log(Math.random());
} 
window.addEventListener('scroll', throttle(handle, 1000));

 参考链接 https://www.cnblogs.com/momo798/p/9177767.html

posted @ 2021-01-18 17:08  eightabs  阅读(52)  评论(0编辑  收藏  举报