JS---节流和防抖的实现

1. 函数防抖(debounce)

概念: 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。

实现:

function debounce(fn, wait){
  let timer = null;
  return function (){
    let context = this;// 获取当前this
    let args = arguments;// 获取函数传递的参数
    if(timer){
      clearTimeout(timer);
      timer = null; 
    }
    timer = setTimeout(() => {
      fn.apply(context, args);
    }, wait);
  }
}

2. 函数节流(throttle)

概念: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效。

实现:

function throttle(fn, wait) {
  let timer = null;
  return function () {
    let context = this; // 获取当前this
    let args = arguments; // 获取函数传递的参数
    if (!timer) {
      timer = setTimeout(() => {
        timer = null;
        fn.apply(context, args);
      }, wait);
    }
  }
}

3. 使用

<input type="text" id="inp">
<button id="btn">节流点击---2s内只触发一次</button>

<script>
// 防抖函数的使用
let fn = debounce((e) => {
  console.log(e.target.value);
}, 1000);
// 键盘输入后一秒打印input框内容
document.getElementById("inp").addEventListener("keyup", function (e) {
  fn(e, 1, 2, 3);
})

// 节流函数的使用
let fn1 = throttle((e) => {
  console.log(parseInt(Math.random() * 10 + 1), e);
}, 2000);
// 两秒内点击多次只触发一次
document.getElementById("btn").onclick = function (e) {
  fn1(e);
}
</script>
上一篇:Vue3 制作发送验证码倒计时


下一篇:什么是防抖和节流?有什么区别?如何实现?