前端优化 - 防抖和节流

📢 鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢 VUE专栏:想学VUE的,冲这里

📢 CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!!!!!!!

目录

[✨ 前言](#✨ 前言)

防抖(debounce)

节流(throttle)

[✨ 结语](#✨ 结语)


✨ 前言

在前端开发中,我们经常需要绑定处理函数到一些频繁触发的事件上,如scroll、resize、input等。如果事件处理函数执行频率过高,会对页面性能产生很大影响。

防抖(debounce)

防抖的原理是:触发事件后,延迟一段时间执行处理函数,如果在延迟时间内再次触发事件,会重新开始延时。

防抖可以使用的场景:

  • 输入框实时搜索Suggest
  • 窗口resize时调整样式

示例代码:

javascript 复制代码
function debounce(func, delay) {
  let timer = null;
  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func(); 
    }, delay);
  }
}

// 输入框搜索uggest
const search = debounce(() => {
  // 获取输入值后请求suggest
}, 500);

input.addEventListener('input', search);

防抖的一般实现步骤:

1、创建一个延迟调用方法,使用闭包保存需要执行的函数

javascript 复制代码
function debounce(func, delay) {

  let timeout;

  return function() {
    
    // 保存函数执行上下文和参数,传递给延迟函数
  }

}

2、每次事件触发时,都清除之前的延时调用

javascript 复制代码
function debounce(func, delay) {

  let timeout;

  return function() {
    clearTimeout(timeout);
    
    // 省略
  }

}

3、设置一个新的延时调用

javascript 复制代码
function debounce(func, delay) {

  let timeout;

  return function() {
    clearTimeout(timeout);

    timeout = setTimeout(() => {
      func();
    }, delay);
  }

}

4、考虑附加参数并返回函数调用结果

javascript 复制代码
function debounce(func, delay) {

  return function(...args) {
    clearTimeout(timeout);
    
    timeout = setTimeout(() => {
      return func(...args);
    }, delay);
  }

}

返回一个可以取消延时的函数

javascript 复制代码
function debounce(func, delay) {

  let timeout;

  return function(...args) {
    clearTimeout(timeout);
    
    timeout = setTimeout(() => {
      func(...args);
    }, delay);

    return () => clearTimeout(timeout);
  }

}

这样就实现了一个功能较完整的防抖函数,在不断调用时只执行最后一次,并可以通过返回的函数取消延迟。

节流(throttle)

节流的原理是:触发事件一段时间内只执行一次处理函数。

节流可使用的场景:

  • 滚动加载更多内容
  • 限制按钮提交频率

示例代码:

javascript 复制代码
function throttle(func, delay) {
  let prev = 0;
  return function() {
    let now = Date.now();
    if (now - prev > delay) {
      func();
      prev = now;
    }
  }
}

// 滚动加载更多
window.addEventListener('scroll', throttle(() => {
  //请求加载更多数据
}, 500));

来关于节流函数,我也给出一些更完整和详细的实现思路:

1、创建一个可以保存执行时间和方法的闭包

javascript 复制代码
function throttle(func, delay) {

  let lastTime;

  return function() {

    // 保留函数执行上下文和参数
  }

}

2、每次事件触发,比较当前时间和上次时间

javascript 复制代码
function throttle(func, delay) {

  let lastTime = Date.now();

  return function() {

    let now = Date.now();

    if (now - lastTime > delay) {
      // 函数处理逻辑
    }

  }

}

3、在时间差大于阈值时,执行函数并更新最后时间

javascript 复制代码
function throttle(func, delay) {

  let lastTime = Date.now();

  return function() {

    let now = Date.now();

    if (now - lastTime > delay) {
      func();
      lastTime = now; 
    }

  }

}

4、考虑附加参数并返回函数执行结果

javascript 复制代码
function throttle(func, delay) {
  
  return function(...args) {

    // 时间比较逻辑

    return func(...args);

  }

}

5、返回取消延时的方法

javascript 复制代码
function throttle(func, delay) {

  let timeout;

  // 实现逻辑  

  return () => clearTimeout(timeout); 

}

这样就实现了一个具有基本功能的节流函数,它可以帮助我们限制函数执行频率,避免过快调用。

✨ 结语

防抖和节流都是优化高频率执行事件的技巧。区别在于:

  • 防抖是将多次执行变为最后一次执行
  • 节流是将多次执行变成每隔一段时间执行

根据需要选用合适的方式,可以有效避免页面过渡渲染,提升性能。

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A2 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄2 天前
JavaScript 隐式全局变量解析
javascript
honkun62 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net