函数防抖、函数节流

1.定义:

  函数防抖:触发事件后wait时间内函数只执行一次,如果在wait时间内又触发了事件,则会重新计算函数执行时间

//函数防抖
let timer
function debounce(fn,wait) { 
  clearTimeout(timer);
  timer = setTimeout(() => {
    fn();
  }, wait);
}

  函数节流:限制函数在一定时间内只能执行一次

//函数节流
let timer;
function throttle(fn,wait) {
  if (timer) {
    return;
  }
  timer = setTimeout(() => {
    fn();
    timer = null;
  }, wait);
}

 

2.解析:

  乍一看节流和防抖的定义并不好理解和区分,我这里类比两个生活中的例子:

  函数防抖:类似于乘坐电梯,电梯门假设3秒后会自动关闭,关门可以看做要执行的函数,3s是等待时间,但是如果在3s这段时间内有人要上电梯,点了开门,那么就会重新计算时间,在这次点击开门3s后门自动关闭。

  函数节流:类似于公交车,从始发站公交车10分钟发一趟车,在10分钟这段时间内,只会发这一趟车。

3.实例:

  写了个简单的例子,将防抖函数和节流函数采用闭包的形式封装作为公共方法。

//函数防抖
function debounce() { 
    let timer = null;
    return function (fn,wait) { 
        clearTimeout(timer);
        timer = setTimeout(() => {
            fn();
        }, wait);
    }
}

//函数节流
function throttle() {
    let timer = null;
    return function (fn,wait) { 
        if (timer) {
            return;
        }
        timer = setTimeout(() => {
            fn();
            timer = null;
        }, wait);
    }
}

  页面中有需要时,传参并调用。

    <input id="inputId" onkeyup="debounceFn(inputSay,1000)" placeholder="函数防抖"/>
    <button onclick="throttleFn(btnSay, 1000)">函数节流</button>
var debounceFn = debounce();
var throttleFn = throttle();

function inputSay() { console.log(document.getElementById('inputId').value); } function btnSay() { console.log('函数节流'); }

 

posted @ 2020-04-29 16:05  Butter_Fly  阅读(159)  评论(0编辑  收藏  举报