函数节流和函数防抖(新手适用)

102 阅读1分钟

防抖和节流

函数节流:设置一个时间间隔,如果一个频繁触发的事件发生大于该时间间隔,就执行,否则不执行。(应用在 resize 、scorll事件)

是确保函数特定的时间内至多执行一次。

  • 时间戳的写法,第一次立即执行
function throttle(callback,wait) {
  //定义开始时间
  let start = 0
// 返回结果是一个函数
  return function (e) {
    //判断时间间隔,获取当前时间戳
    let now = Date.now()
    //判断
    if (now - start >= wait) {
      //如果满足判断,则执行回调函数
      callback.call(this,e)//this指向返回事件源
      //修改开始时间
      start = now
    }
  }
}
  • 第一次(最后一次)不立即执行的写法
function throttle(fn,interval){
    let timer = null
    return funtion(){
        let context = this
        if(!timer){
            timer = SetTimeout(funtion(){
                fn.apply(context,arguments)//这里的arguments是指传入的参数
                timer = null
            },interval)
        }
    }
}
  • 第一次不立即执行的写法,最后一次立即执行的写法
funtion throttle(fn,delay){
    let timer = null
    let start = Date.now()
    
    return funtion(){
        let curTime = Date.now()
        let remainTime = delay - (cutTime - start)//剩余时间= 完整间隔时间- 已经过去的时间
        let context = this
        cleanTimeout(timer)//要保证每次进入,都要重新计算remainTime
        if(remainTime <= 0){
            fn.apply(context,arguments)
            start = Date.now()
        }else{
            timer = setTimeout(fn,remainTime)
        }
    }
}
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript" src="./函数节流.js"></script>
  <style>
  body{
    height: 2000px;
    background: linear-gradient(paleturquoise,pink);
  }
  </style>
</head>
<body>
  <script type="text/javascript">
    //绑定滚动事件

    window.addEventListener('scroll',throttle(function (e) {
      // console.log(Date.now())
      console.log(e)
    },500))

  </script>
</body>
</html>

截屏2021-09-14 16.47.48.png

函数防抖:一个事件 如果在一段时间内没有再次触发 就执行,;如果再次触发,就再等一会。(应用在 input 关键字搜索事件)

是函数在特定的时间内不被再调用后执行。

function debounce(callback,time) {
  //定时器变量
  let timeId = null
  //返回一个函数
  return function (e) {
    //判断
    if (timeId !== null) {
      //清空定时器
      clearTimeout(timeId)
    }
    //启动定时器
    timeId = setTimeout(()=>{
      //执行回调
      callback.call(this,e)//这里回调函数的this是外层的this
    },time)
  }
}
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <script type="text/javascript" src="./函数防抖.js"></script>
</head>
<body>
<input type="text">
<script type="text/javascript">
  let input = document.querySelector('input')
  // input.onkeydown = function (e) {
  //   console.log(e.keyCode)
  // }
  input.onkeydown = debounce( function (e) {
    console.log(e.keyCode)
  },500)
</script>
</body>
</html>

截屏2021-09-14 16.48.28.png