防抖和节流

一:函数防抖
1、理解:触发高频事件n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间
2、思路:每次触发事件时都取消之前的延时调用方法

3、实现

export const Debounce = (fn, t) => {
  let delay = t || 500;
  let timer;
  return function () {
    let args = arguments;
    if (timer) {
      clearTimeout(timer);
    }
    timer = setTimeout(() => {
      timer = null;
      fn.apply(this, args);
    }, delay);
  };
};

实例

<template>
 <div>
  <input type='text' v-model='value' @keydown = "hangleChange">
 </div>
</template>

<script>
 function Debounce(fn, t){
    let delay = t || 500;
    let timer;
    return function () {
      let args = arguments;
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        timer = null;
        fn.apply(this, args);
      }, delay);
    };
  };
export default{
 name:'',
 data(){
  return{
   value:''
  }
},
 methods:{
  hangleChange:debounce(function(e){
   console.log(this.value)
  })
 }
}
</script>

二:函数节流

1、理解:高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率

2、解释:每次触发事件都判断当前是否有等待执行的延时函数

3、实现:

  function fnThrottle(fn,t){  //节流函数
      let canRun = true; // 通过闭包保存一个标记
      let delay = t || 500;
      return function () {
        if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
        canRun = false; // 立即设置为false
        setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
          fn.apply(this, arguments);
          // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
          canRun = true;
        }, delay);
      };
    }

实例:跟防抖调用一样,就不重复写了

 

防抖和节流的作用都是防止函数多次调用。区别在于,假设一个用户一直触发这个函数,且每次触发函数的间隔小于wait,防抖的情况下只会调用一次,而节流的 情况会每隔一定时间(参数wait)调用函数。

 

posted @ 2021-08-11 11:38  bingyingks  阅读(50)  评论(0)    收藏  举报