防抖与节流详细讲解

2024-08-28 18:20
文章标签 讲解 详细 节流 防抖

本文主要是介绍防抖与节流详细讲解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

在前端的面试中我们经常会听到面试官问到什么是防抖与节流?会需要我们详细的讲解他们各自的用法,以及不同点。

为此特地全面的讲解一下防抖与节流,在加深对二者的理解,同时方便大家参考。首先提出几个问题,希望大家带着问题来看这篇文章:

  1. 什么是防抖与节流?
  2. 他们之间有什么联系,为什么总是一起问?
  3. 他们之间的不同点是什么?
  4. 他们各自的使用场景是什么?
  5. 如何封装防抖与节流

二、防抖(debounce)

2.1 定义

防抖(debounce),在一段时间内多次执行相同函数,但只会触发最后一次函数调用。通俗一点讲就是设置一个规定时间(假设是一秒钟),在规定时间内触发事件函数都会使时间重新计时,当规定时间过了直接执行最后一次事件函数;

2.2 使用场景

  1. 按钮重复点击;
  2. 搜索条的输入搜索;
  3. 输入验证;

2.3 实现原理

  1. 利用setTimeout定义一个规定时间;
  2. 当规定时间内再次触发了时间,则清空定时器重新计时;
  3. 当规定时间结束后执行最后一次事件函数;

2.4 防抖函数封装

// 防抖函数封装
const _debounce = (fn, delay) => {// 利用闭包定义定时器id变量存储let timer = null;return () => {// 如果有值就清除定时器,重新计时if (timer) {clearTimeout(timer)}timer = setTimeout(fn, delay);}
};
// 窗口大小发生改变触发函数
const onResize = () => {console.log("界面窗口发生改变");
};
// 监听窗口大小发生变化
window.addEventListener('resize', _debounce(onResize, 500));

三、节流(throttle)

3.1 定义

节流(throttle)在一段时间内多次执行相同函数,但只会触发第一次函数调用。通俗一点讲就是设置一个规定时间(假设是一秒钟),在规定时间内触发事件函数只会执行第一次;如果在规定的时间间隔内再次触发事件,函数不会被执行,直到时间间隔结束。

3.2 使用场景

  1. 表单提交按钮避免重复点击,重复调用接口;
  2. 页面加载时的资源加载;
  3. 滚动事件;
  4. 窗口大小调整监听;
  5. 输入框的重复输入搜索;

3.3 实现原理

  1. 利用setTimeout定义一个规定时间;
  2. 在规定时间内只执行一次函数;
  3. 如果规定时间没到则不执行事件函数,反之执行;

3.4 防抖函数封装

const _throttle = (fn, delay) => {let timer = null;return () => {if (!timer) {timer = setTimeout(() => {fn();timer = null;}, delay);}}
};
// 窗口大小发生改变触发函数
const onResize = () => {console.log("界面窗口发生改变");
};
// 监听窗口大小发生变化
window.addEventListener('resize', _throttle(onResize, 500));

四、防抖与节流的区别

4.1 相同点

  1. 都是用来实现前端性能优化的不同方式;
  2. 主要用于控制事件函数的执行频率;

4.2 不同点

  1. 防抖是在规定时间内执行最后一次函数
  2. 节流是在规定时间内执行第一次函数
  3. 节流会在规定时间内一次又一次的执行,可以想象雨滴匀速下落;
  4. 防抖是在规定时间内重复触发都会重新计时,类比输入框不停的打字当停下后再去调用搜索;

五、总结

防抖(Debounce)和节流(Throttle)是都是常用的前端优化技术,用于控制函数的执行频率,但它们的实现原理和应用场景有所不同。

需要理解他们各自的实现原理,从而在日常开发中使用到对应场景中。

这篇关于防抖与节流详细讲解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1115532

相关文章

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

JAVA SpringBoot集成Jasypt进行加密、解密的详细过程

《JAVASpringBoot集成Jasypt进行加密、解密的详细过程》文章详细介绍了如何在SpringBoot项目中集成Jasypt进行加密和解密,包括Jasypt简介、如何添加依赖、配置加密密钥... 目录Java (SpringBoot) 集成 Jasypt 进行加密、解密 - 详细教程一、Jasyp

Java 操作 MinIO详细步骤

《Java操作MinIO详细步骤》本文详细介绍了如何使用Java操作MinIO,涵盖了从环境准备、核心API详解到实战场景的全过程,文章从基础的桶和对象操作开始,到大文件分片上传、预签名URL生成... 目录Java 操作 MinIO 全指南:从 API 详解到实战场景引言:为什么选择 MinIO?一、环境

Redis的安全机制详细介绍及配置方法

《Redis的安全机制详细介绍及配置方法》本文介绍Redis安全机制的配置方法,包括绑定IP地址、设置密码、保护模式、禁用危险命令、防火墙限制、TLS加密、客户端连接限制、最大内存使用和日志审计等,通... 目录1. 绑定 IP 地址2. 设置密码3. 保护模式4. 禁用危险命令5. 通过防火墙限制访问6.

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

Python操作Excel的实用工具与库openpyxl/pandas的详细指南

《Python操作Excel的实用工具与库openpyxl/pandas的详细指南》在日常数据处理工作中,Excel是最常见的数据文件格式之一,本文将带你了解openpyxl和pandas的核心用法,... 目录一、openpyxl:原生 Excel 文件操作库1. 安装 openpyxl2. 创建 Exc

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python的pandas库基础知识超详细教程

《Python的pandas库基础知识超详细教程》Pandas是Python数据处理核心库,提供Series和DataFrame结构,支持CSV/Excel/SQL等数据源导入及清洗、合并、统计等功能... 目录一、配置环境二、序列和数据表2.1 初始化2.2  获取数值2.3 获取索引2.4 索引取内容2