节流&防抖

节流:wait时间内只能执行一次func

防抖:触发后延迟wait秒调用func

代码对比:(建议自己手敲一遍,不要养成直接cv的坏习惯)

节流:

其中的apply函数是

apply() 是 JavaScript 函数的一个方法,它用于调用函数并设置函数内部 this 关键字的指向。

throttle() 函数中,func 是传入的需要防抖的函数,args 是该函数的参数列表。当节流函数执行时,会通过 apply() 方法调用传入的函数,并将 this 指向当前的上下文环境,同时将参数 args 传递给该函数。

节流函数通常运用在限制调用频率场景

  • 搜索框输入时的实时联想
  • 拖拽场景防止超高频次触发位置变动
  • 滚动场景监听scroll事件计算位置信息,比如判断是否到页面底部自动加载更多

防抖:

防抖函数通常运用在限制调用次数场景

  • 文本输入的验证,连续输入后验证一次即可
  • 防止鼠标迅速点击多次提交按钮
  • 监听 resize 事件计算尺寸信息
javascript 复制代码
//防抖
function debounce(func, wait) {
  let timer = null;

  return function () {
    //检查是否存在定时器
    if (timer) {
      //清除定时器
      clearInterval(timer);
      timer = null;
    }

    let self = this;
    let args = arguments;//args 是用户函数的参数列表

    timer = setTimeout(function () {
      func.apply(self, args);//执行用户函数
      timer = null;//重置定时器
    }, wait)
  }
}
//节流
//func是用户传入需要防抖的函数
//wait是等待时间
function throttle(func, wait=50) {
  let lastTime = 0;//上一次执行该函数的时间
  let timer = null;

  return function () {
    //如果存在定时器要先清除
    if (timer) {
      clearInterval(timer);
      timer = null;
    }

    let self = this;
    let args = arguments;
    let nowTime = +new Date();

    //剩余等待时间
    const remainWaitTime = wait - (nowTime - lastTime);

    if (remainWaitTime <= 0) {
      lastTime = nowTime;
      //apply() 是 JavaScript 函数的一个方法,它用于调用函数并设置函数内部 this 关键字的指向。
      func.apply(self, args);
    } else {
      //继续等待remainWaitTime再执行
      timer = setTimeout(function () {
        lastTime = +new Date();
        func.apply(self, args);
        timer = null;//重置定时器
      }, remainWaitTime)
    }
  }
}
相关推荐
flying robot几秒前
js在浏览器执行原理
开发语言·javascript·ecmascript
熊猫钓鱼>_>2 小时前
建筑IT数字化突围:建筑设计企业的生存法则重塑
前端·javascript·easyui
GISer_Jing4 小时前
前端性能指标及优化策略——从加载、渲染和交互阶段分别解读详解并以Webpack+Vue项目为例进行解读
前端·javascript·vue
&白帝&8 小时前
vue右键显示菜单
前端·javascript·vue.js
Wannaer8 小时前
从 Vue3 回望 Vue2:事件总线的前世今生
前端·javascript·vue.js
羽球知道8 小时前
在Spark搭建YARN
前端·javascript·ajax
光影少年8 小时前
vue中,created和mounted两个钩子之间调用时差值受什么影响
前端·javascript·vue.js
恋猫de小郭9 小时前
如何查看项目是否支持最新 Android 16K Page Size 一文汇总
android·开发语言·javascript·kotlin
赵大仁10 小时前
React Native 与 Expo
javascript·react native·react.js
程序员与背包客_CoderZ11 小时前
Node.js异步编程——Callback回调函数实现
前端·javascript·node.js·web