饥人谷技术博客

JavaScript之函数节流(throttle)

2017-09-21  本文已影响0人  庄海鑫

前端菜鸟一只,查阅了一些资料,大概明白了什么是函数节流


是什么?

就是让一个函数无法在很短的时间间隔内连续执行,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。

为什么?

浏览器中某些计算和处理比其他要昂贵的多。例如,DOM操作比非DOM交互需要更多的内存和CPU时间。连续尝试很多DOM操作会导致浏览器挂起甚至崩溃。比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove)。也就是说用户在触发这些浏览器操作的时候,如果脚本里面绑定了对应的事件处理方法,这个方法就不停的触发。

应用场景

如果函数节流根据应用场景具体细分,还分两种。


简单实现

  var timer;
  function throttle(){
    if(timer){
      clearTimeout(timer);
      console.log('3');
    }
    timer=setTimeout(function(){
      console.log('函数防抖')
    },1000);
  }
  for(var i=0;i<10;i++){
  console.log("1");
  throttle();
  console.log('2');
}

上面的代码其实就是一个函数防抖,只执行最后一次。


接下来我们对整体进行封装

  function throttle(fn, delay) {
      var timer = null;
      return function () {
        clearTimeout(timer);
        timer = setTimeout(function () {
          fn(arguments)}, delay);
      }
    }

    function fn() {
      console.log("函数防抖");
    }
    var fn2 = throttle(fn, 1000);
    fn2();
    fn2();
    fn2();

然后我们再次改进变成函数节流,可以隔断时间触发回调函数

var throttle = function (fn, delay, atleast) {
    var timer = null;
    var previous = null;

    return function () {
        var now = +new Date();

        if ( !previous ) previous = now;

        if ( now - previous > atleast ) {
            fn();
            // 重置上一次开始时间为本次结束时间
            previous = now;
        } else {
            clearTimeout(timer);
            timer = setTimeout(function() {
                fn();
            }, delay);
        }
    }
};

参考资料:函数节流详解

上一篇 下一篇

猜你喜欢

热点阅读