防抖和节流

53 阅读1分钟

防抖

防抖指事件被在n秒内被触发时,需要重新等待 n 秒后再执行,如果在n秒内一直被触发,则需要一直等待

 function debounce(fn, delay) {
        //存储延时器地返回值
        let timer;
        return function () {
          // 清除上一个延时器,有则清除
          timer && clearTimeout(timer);
          //保存事件对象的this和参数
          let _this = this;
          let _agrs = arguments;
          timer = setTimeout(function () {
            //调用fn并修正this指向和参数
            fn.apply(_this,_agrs);
          }, delay);
        };
      }

节流

指事件在某段时间内只执行一次,若事件多次触发,则会一直等到规定时间后才执行

 function throttle(fn, delay) {
         //定义一个变量,记录上一次的执行时间
        let lastTime = 0;
        return function () {
         //定义一个记录当前执行时间的变量
          let nowTime = Date.now();
          //当时间间隔大于规定时才会触发事件执行
          if (nowTime - lastTime > delay) {
          //调用fn的同时应该修正fn的this指向和参数,让this指向事件对象
            fn.apply(this,arguments);
            //更新lastTime的值,用于下次判断
            lastTime = nowTime;
          }
        };
      }
document.addEventListener('scroll', throttle(function(){}, 1000));

区别

  • 防抖
    通常用于键盘事件
  • 节流
    通常用于鼠标事件

文章如有错漏,欢迎各位大佬指正