防抖和节流

117 阅读2分钟

节流:

  • 第一次执行时,是一定能执行函数的。
  • n秒内第二次触发的时候,当第一次与第二次间隔不足设置的间隔时间时,就不会执行。之后第三、第四次触发还是不执行。
  • 直到 n秒之后有且仅有一次,并且是第一次再次触发函数。 函数节流是减少函数的触发频率;

防抖:

  • 第一次触发函数时,定义了一个定时器。在 n秒后执行。
  • 函数第二次触发的时候,由于闭包的特性,这时候的 timer已经是第一次触发时的 定时器的标识了。然后直接清除第一次的setTimeout,这时候第一次的setTimeout里面的内容就不会执行了。然后再定义第二次的setTimeout。
  • 然后重复第二个步骤,一直清除,又一直设置。直到函数最后一次触发,定义了最后的一个定时器,并且间隔 n秒 执行。
  • 如果在 最后一个定时器没执行时,函数又触发了,那么又重复第三步。相当于 设置的间隔时间,只是延迟函数执行的时间,而不是间隔多少秒再执行。

函数防抖是延迟函数执行,并且不管触发多少次都只执行最后一次。

1.方法定义

/*函数节流*/
function throt(fn, interval) {
  //触发的时间
  let initTime = 0; 
  return function() {
    //第一次函数return(触发时间)
    let backTime = new Date();
    //第一次触发时间-触发时间>=触发时间
    if (backTime - initTime > (interval || 300)) {
      fn.call(this,arguments);
      //赋值给第一次触发的时间,这样就保存了第二次触发的时间
      initTime = backTime;
    }
  };
}

/*函数防抖*/
function debo(fn, interval) {
  var timer;
  //间隔时间,如果interval不传,则默认1000ms
  return function() {
    clearTimeout(timer);
    let context=this
    // 因为setTimeout是全局的,arguments不是防抖函数需要的。
    timer = setTimeout(function() {
      fn.call(context,arguments);
    }, (interval || 1000));
  };
}

export default {
  throt,
  debo
};

2.页面使用

import utl from "../utils/util.js";
Page({
   data:{
    top:0
   },
   onPageScroll: utl.throt(function(msg){
      this.setData({
        top:msg[0].scrollTop
      });
      console.log(11111)
   },1000),
   
   handle: utl.debo(function() {
      this.getData();
   }),
   getData(){
      console.log(2222222222)
   }
})