节流防抖:提升前端性能的秘密武器(上)

在这里插入图片描述

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6
🍨 阿珊和她的猫_CSDN个人主页
🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》
🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

文章目录

  • 一、引言
    • 介绍节流防抖的概念和重要性
    • 为什么需要节流防抖
  • 二、节流防抖的原理
    • 解释节流和防抖的基本原理
    • 二者的实现方式和应用场景
  • 三、使用 JavaScript 实现节流防抖
    • 简单的示例代码

一、引言

介绍节流防抖的概念和重要性

节流防抖是在 JavaScript 中常见的两种技术,用于限制某个函数在短时间内被频繁调用。

节流 是指在一定时间内,限制函数的调用次数,即如果函数在指定的时间内被调用,只有第一次调用会被执行,直到下一个指定的时间间隔才会再次执行。

防抖 是指在一定时间内,延迟函数的执行,即如果函数在指定的时间内被频繁调用,只会执行最后一次调用,之前的调用都会被取消。

这两种技术的重要性在于它们可以提高应用程序的性能和用户体验。例如,在搜索框输入时,如果每次输入一个字符就发送一个请求到服务器,可能会导致大量不必要的请求,从而降低应用程序的性能。使用节流或防抖技术可以限制请求的频率,减少服务器的负载,并提高用户体验。

另外,节流和防抖技术还可以用于其他场景,例如按钮提交、滚动事件处理等,以避免不必要的操作和提高应用程序的响应能力。

为什么需要节流防抖

需要使用节流防抖的原因有以下几点:

  1. 性能优化:在一些场景中,频繁地执行某个函数可能会导致性能问题,例如在浏览器中进行 DOM 操作或发送网络请求。通过使用节流或防抖,可以限制函数的执行频率,减少不必要的计算和资源消耗,从而提高应用程序的性能

  2. 减少冗余操作:有时候,用户可能会在短时间内快速触发同一个事件多次,而实际上只需要最后一次触发的操作被执行。例如,在搜索框中输入文字时,用户可能会连续输入多个字符,但只需要最后输入的内容进行搜索。通过使用节流或防抖,可以避免执行之前的冗余操作,只执行最后一次触发的操作。

  3. 提升用户体验:在某些情况下,频繁的操作可能会给用户带来不好的体验,例如在输入框中输入文字时,如果每次输入一个字符就发送一个请求到服务器,可能会导致页面卡顿或响应延迟。通过使用节流或防抖,可以减少这种不必要的操作,提高用户输入的流畅度和响应速度。

综上所述,节流防抖是一种用于优化性能、减少冗余操作和提升用户体验的技术手段,在需要限制某个函数的执行频率或避免短时间内多次触发同一个事件的场景中非常有用。

二、节流防抖的原理

解释节流和防抖的基本原理

节流 的基本原理是在指定的时间间隔内,只允许函数被调用一次。如果函数在该时间间隔内被再次调用,那么只有第一次调用会被执行,其他调用都会被忽略。直到时间间隔过去后,才会执行下一次调用。

以下是一个简单的节流示例代码:

function throttle(func, delay) {
  // 使用 flag 来记录上次执行时间
  let flag = true; 

  return function() {
    if (flag) {
      flag = false;
      setTimeout(() => {
        func.apply(this, arguments);
        flag = true;
      }, delay);
    }
  };
}

在上述代码中,throttle 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时检查 flag 的状态。如果 flagtrue,表示上次调用还在时间间隔内,那么本次调用将被忽略。如果 flagfalse,表示上次调用已经过去了时间间隔,那么会执行 func 函数,并将 flag 设为 true。然后,使用 setTimeout 延迟一段时间后再次将 flag 设为 false,以便下一次调用可以执行。

防抖 的基本原理是将多个连续的函数调用合并为一个,只在最后一次调用后执行函数。如果在指定的时间间隔内再次触发事件,之前的延迟操作会被取消,重新开始计时。

以下是一个简单的防抖示例代码:

function debounce(func, delay) {
  let debounceTimer; 

  return function() {
    // 清除之前设置的定时器
    clearTimeout(debounceTimer);
    debounceTimer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

在上述代码中,debounce 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时清除之前设置的定时器,并重新设置一个定时器。只有在定时器到期后,才会执行 func 函数。

通过使用节流和防抖,可以有效地限制某个函数在短时间内被频繁调用,从而提高应用程序的性能和用户体验。

二者的实现方式和应用场景

以下是二者实现方式和应用场景的详细解释:

  1. 节流
  • 实现方式:节流通过控制函数在指定的时间间隔内只执行一次来实现。当函数被调用时,它会检查上一次执行的时间,如果距离上次执行时间小于时间间隔,就会忽略本次调用。否则,它会执行函数,并重新开始计时。

  • 应用场景:节流适用于需要限制某个操作执行频率的场景。例如,在搜索框输入时,每次按键都会发送一个请求到服务器进行搜索。使用节流可以将请求合并为每隔一段时间发送一次,避免频繁请求导致的性能问题。

  1. 防抖
  • 实现方式:防抖通过延迟函数的执行来实现。当函数被调用时,它会启动一个定时器。如果在定时器到期前函数再次被调用,它会重置定时器并重新开始计时。只有当定时器到期且期间没有再次调用函数时,才会执行函数。

  • 应用场景:防抖适用于需要在用户操作结束后执行某个操作的场景。例如,在提交表单时,用户可能会连续点击提交按钮多次,但只希望最后一次点击提交数据。使用防抖可以确保只有最后一次点击会触发提交操作。

总的来说,节流和防抖都是用于优化性能和用户体验的技术。它们的主要区别在于节流是限制函数的执行频率,而防抖是延迟函数的执行直到用户停止操作。选择使用哪种技术取决于具体的需求和场景。

三、使用 JavaScript 实现节流防抖

简单的示例代码

以下是使用 JavaScript 实现节流防抖的简单示例代码:

  1. 节流
// 创建一个节流函数
function throttle(func, delay) {
 // 使用 flag 来记录上次执行时间
 let flag = true; 

 return function() {
 if (flag) {
 flag = false;
 // 使用 setTimeout 延迟执行
 setTimeout(() => {
 func.apply(this, arguments);
 flag = true;
 }, delay);
 }
 }
}

// 创建一个测试函数
const exampleFunction = () => {
 console.log('函数执行!');
}

// 使用节流函数包装测试函数
const throttledFunction = throttle(exampleFunction, 1000);

// 调用节流后的函数
throttledFunction();
throttledFunction();
throttledFunction();

在上述示例中,throttle 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时检查 flag 的状态。如果 flagtrue,表示上次调用还在时间间隔内,那么本次调用将被忽略。如果 flagfalse,表示上次调用已经过去了时间间隔,那么会执行 func 函数,并将 flag 设为 true。然后,使用 setTimeout 延迟一段时间后再次将 flag 设为 false,以便下一次调用可以执行。

  1. 防抖
// 创建一个防抖函数
function debounce(func, delay) {
 let debounceTimer; 

 return function() {
 const context = this;
 const args = arguments; 

 // 清除之前设置的定时器
 clearTimeout(debounceTimer);
 debounceTimer = setTimeout(() => {
 func.apply(context, args);
 }, delay);
 }
}

// 创建一个测试函数
const exampleFunction = () => {
 console.log('函数执行!');
}

// 使用防抖函数包装测试函数
const debouncedFunction = debounce(exampleFunction, 1000);

// 调用防抖后的函数
debouncedFunction();
debouncedFunction();
debouncedFunction();

在上述示例中,debounce 函数接受一个要限制频率的函数 func 和一个时间间隔 delay。它返回一个新的函数,该函数会在每次调用时清除之前设置的定时器,并重新设置一个定时器。只有在定时器到期后,才会执行 func 函数。

通过使用节流和防抖,可以有效地限制某个函数在短时间内被频繁调用,从而提高应用程序的性能和用户体验。

请注意,这只是一个简单的示例,实际应用中可能需要根据具体情况进行一些调整和优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/242111.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【音视频 | H.264】H.264编码详解

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

VMware安装ContOS 7 提示“客户机操作系统已禁用 CPU。请关闭或重置虚拟机。”

目录 实验环境报错截图报错原因猜测(根据实验现象)解决办法如下 实验环境 Vmware Workstation 17.5 CentOS7 镜像版本:2207-02版本 注意:2009版本并无该错误 报错截图 报错原因猜测(根据实验现象) CentO…

MIT6.824-Raft笔记6:不一致log处理、日志快照

本部分主要是关于不一致的日志是怎么决策和取舍的。同时对于日志的恢复,通过快照的方式提高恢复的效率。 1. 不一致log的处理 在我们分析之前,我们需要明白这个场景是否真的存在,因为有些场景不可能存在我们也就没必要考虑它。即需要思考这种…

使用PM2,在生产环境稳定运行你的node项目

PM2 一个 node&#xff0c;本身就用几行代码&#xff0c;就可以启动个 server 进程&#xff0c;监听个端口&#xff0c;为大家提供 Web 服务 一、依赖安装 npm install pm2 -g 二、命令行启动 普通执行启动 pm2 start <js 文件路径 >.js 携带参数启动 pm2 start < 某种…

k8s debug 浅谈

一 k8s debug 浅谈 说明&#xff1a; 本文只是基于对kubectl debug浅显认识总结的知识点,后续实际使用再补充案例 Kubernetes 官方出品调试工具上手指南(无需安装&#xff0c;开箱即用) debug-application 简化 Pod 故障诊断: kubectl-debug 介绍 1.18 版本之前需要自己…

什么是主动学习(Active Learning)?定义,原理,以及主要方法

数据是训练任何机器学习模型的关键。但是&#xff0c;对于研究人工智能的企业和团队而言&#xff0c;数据仍是实现成功的最大障碍之一。首先&#xff0c;您需要大量数据来创建高性能模型。更重要的是&#xff0c;您需要标注准确的数据。虽然许多团队一开始都是手动标注数据集&a…

使用 Taro 开发鸿蒙原生应用 —— 当 Taro 遇到纯血鸿蒙 | 京东云技术团队

纯血鸿蒙即将到来 在今年 8 月的「2023年华为开发者大会&#xff08;HDC.Together&#xff09;」上&#xff0c;华为正式官宣「鸿蒙Next」&#xff0c;这个更新的版本将移除所有的 AOSP 代码&#xff0c;彻底与 Android 切割&#xff0c;使其成为一个完全自主研发的操作系统&a…

JAVA实体类集合该如何去重?

JAVA实体类集合该如何去重&#xff1f; 最近在工作中经常遇到需要去重的需求&#xff0c;所以特意系统的来梳理一下 有目录&#xff0c;不迷路 JAVA实体类集合该如何去重&#xff1f;单元素去重方法一&#xff1a;利用Set去重方法二&#xff1a;利用java 8的stream写法&#xf…

预测性维护对制造企业设备管理的作用

制造企业设备管理和维护对于生产效率和成本控制至关重要。然而&#xff0c;传统的维护方法往往无法准确预测设备故障&#xff0c;导致生产中断和高额维修费用。为了应对这一挑战&#xff0c;越来越多的制造企业开始采用预测性维护技术。 预测性维护是通过传感器数据、机器学习和…

【教3妹学编程-算法题】消除相邻近似相等字符

插&#xff1a; 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家一起学习鸭~~~ 3妹&#xff1a;好冷啊&#xff0c; 冻得瑟瑟发抖啦 2…

Python Paramiko库:SSH远程连接与文件传输实战指南

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在网络管理和系统运维中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种广泛用于远程登录和文件传输的协议。Python中的Paramiko库为开发者提供了灵活、强大的SSH客户端和服务器功能。本文将深入探讨…

微服务实战系列之MQ

前言 从今天起&#xff0c;席卷北国的雪&#xff0c;持续了一整天&#xff0c;北京也不例外。这场意外的寒潮&#xff0c;把整个冬天渲染的格外cool。当然你可以在外面打雪仗、堆雪人、拉雪橇&#xff0c;也可以静坐屋内&#xff0c;来一场围炉煮茶的party。此刻&#xff0c;冬…

社会不教,精英不讲,坎儿还得自己过(揭秘人才成长规律)

推荐大家去看看天涯社区的精华帖子&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&#xff09;》 原出处天涯精华帖&#xff1a;《社会不教&#xff0c;精英不讲&#xff0c;坎儿还得自己过&#xff08;揭秘人才成长规律&…

(企业 / 公司项目)微服务项目解决跨域问题:

前后端分离项目中前端出现了跨域的问题 在网关模块配置文件中添加 配置 application.properties # 允许请求来源&#xff08;老版本叫allowedOrigin&#xff09; spring.cloud.gateway.globalcors.cors-configurations.[/**].allowedOriginPatterns* # 允许携带的头信息 spri…

2023.12.12 关于 Java 反射详解

目录 基本概念 定义 用途 反射相关的类 反射基本原理 Class 类中的相关方法 常用获得类相关的方法 常用获得类中属性相关的方法 常用获得类中构造器相关的方法 常用获得类中方法相关的方法 实例理解 反射优缺点 基本概念 定义 Java 的反射&#xff08;reflection&a…

java中的包

1.包的本质分析(原理) 包的本质 实际上就是创建不同的文件夹来保存类文件 2.一个文件中有两个类的i情况 package com.use;import com.xiaoqiang.Dog;public class Test {public static void main(String[] args) {Dog dog new Dog();System.out.println(dog); //com.xiaoqian…

达索系统SOLIDWORKS 2024 Visualize新功能

SOLIDWORKS Visualize&#xff08;原名为 Bunkspeed&#xff09;是一整套独立的软件工具&#xff0c;Visualize模块主要是用于对SOLIDWORKS设计出的产品图进行渲染、做动画&#xff0c;方便用户更好的展示、宣传产品&#xff1b;以最快速、最轻松的方式创建专业的照片级图像、动…

汽车差速器市场分析:预计2029年将达到218亿元

差速器是为了调整左右轮的转速差而装置的。在四轮驱动时&#xff0c;为了驱动四个车轮&#xff0c;必须将所有的车轮连接起来&#xff0c;如果将四个车轮机械连接在一起&#xff0c;汽车在曲线行驶的时候就不能以相同的速度旋转&#xff0c;为了能让汽车曲线行驶旋转速度基本一…

智能优化算法应用:基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于生物地理学算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.生物地理学算法4.实验参数设定5.算法…

2023年12月14日 十二生肖 今日运势

小运播报&#xff1a;2023年12月14日&#xff0c;星期四&#xff0c;农历十一月初二 &#xff08;癸卯年甲子月丙午日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;羊、狗、虎 需要注意&#xff1a;牛、马、鼠 喜神方位&#xff1a;西南方 财神方位&#xff…