当前位置: 首页 > news >正文

如何精确掌握函数防抖和函数节流的使用?

前序

函数防抖(Debouncing)和函数节流(Throttling)都是用于控制函数执行频率的技术,通常在处理高频率触发的事件(如窗口滚动、鼠标移动、输入框输入等)时非常有用

一、核心概念

函数防抖

函数防抖的核心思想是,在某个事件持续触发时,只有当事件停止触发一段时间后,才执行相应的函数。这意味着如果事件在一定时间内持续触发,函数将不会被执行,直到事件停止触发并且等待一定的延迟时间后才执行。

关键概念:

  • 触发事件时,设置一个定时器,延迟一定时间后执行函数。
  • 如果事件再次触发,清除之前的定时器,重新设置新的定时器。
  • 只有在事件停止触发一段时间后,定时器才会执行函数。

函数节流

函数节流的核心思想是,在某个事件持续触发时,控制函数的执行频率,确保函数在一定时间间隔内最多只能执行一次。与函数防抖不同,函数节流会按照一定的时间间隔持续执行函数,而不会等待事件停止触发。

关键概念:

  • 触发事件时,设置一个定时器,在定时器时间间隔内只允许执行一次函数。
  • 如果事件再次触发,即使定时器还在计时,也不会执行函数,直到定时器计时结束。

二、函数防抖和节流的代码实现

函数防抖的实现:

函数防抖的关键在于使用 setTimeout 来延迟执行函数,如果在延迟期间再次触发事件,则取消之前的延迟,重新设置新的延迟。

function debounce(func, delay) {let timeoutId;return function (...args) {clearTimeout(timeoutId);timeoutId = setTimeout(() => {func.apply(this, args);}, delay);};
}// 使用例子
const debouncedFunction = debounce(() => {console.log("Debounced function executed.");
}, 1000);// 某个事件触发时调用 debouncedFunction
debouncedFunction();

函数节流的实现:

函数节流的关键在于使用一个标志变量来控制函数是否可以执行,以及设置一个定时器,在定时器内将标志变量重置,以便在下一次时间间隔内执行函数。


function throttle(func, delay) {let canRun = true;return function (...args) {if (!canRun) return;canRun = false;setTimeout(() => {func.apply(this, args);canRun = true;}, delay);};
}// 使用例子
const throttledFunction = throttle(() => {console.log("Throttled function executed.");
}, 1000);// 某个事件触发时调用 throttledFunction
throttledFunction();

三、函数防抖和节流的优化

函数防抖(Debouncing)和函数节流(Throttling)的实现可以进一步优化,以满足不同的需求和性能要求。下面是一些可能的优化方式:

函数防抖的优化:

立即执行:有时候,可能希望在事件触发时立即执行一次函数,然后再进行防抖延迟。这可以通过设置一个参数来实现。


function debounce(func, delay, immediate) {let timeoutId;return function (...args) {const context = this;const later = () => {timeoutId = null;if (!immediate) func.apply(context, args);};clearTimeout(timeoutId);if (immediate && !timeoutId) func.apply(context, args);timeoutId = setTimeout(later, delay);};
}

取消防抖:有时候,可能希望能够取消防抖,即立即执行函数并取消延迟。这可以通过返回一个取消函数来实现


function debounce(func, delay) {let timeoutId;function debounced(...args) {const context = this;const later = () => {timeoutId = null;func.apply(context, args);};clearTimeout(timeoutId);timeoutId = setTimeout(later, delay);}debounced.cancel = function () {clearTimeout(timeoutId);};return debounced;
}

函数节流的优化:

开始时立即执行:与函数防抖类似,可以添加一个参数,以便在时间间隔开始时立即执行一次函数。


function throttle(func, delay, immediate) {let canRun = true;return function (...args) {const context = this;if (immediate && canRun) {func.apply(context, args);canRun = false;}if (!immediate) {if (canRun) {canRun = false;setTimeout(() => {func.apply(context, args);canRun = true;}, delay);}}};
}

返回最后一次执行的结果:有时候,可能需要函数节流的同时返回最后一次执行的结果。


function throttle(func, delay) {let canRun = true;let lastResult;return function (...args) {const context = this;if (canRun) {lastResult = func.apply(context, args);canRun = false;setTimeout(() => {canRun = true;}, delay);}return lastResult;};
}

四、函数防抖和节流的比较

函数防抖(Debouncing)和函数节流(Throttling)都是用于控制函数执行频率的技术,但它们在实际应用中有不同的用途和特点。以下是它们的比较:

1、目的和用途:

函数防抖的主要目的是确保在连续触发事件时,只有在事件停止触发一段时间后才执行相应的函数。它适用于需要等待用户停止操作后才执行的场景,如输入框实时搜索、窗口调整大小等。

函数节流的主要目的是控制函数的执行频率,确保函数在一定时间间隔内最多只能执行一次。它适用于需要限制函数执行频率的场景,如滚动事件、按钮点击防抖等。

2、执行时刻:

函数防抖在事件连续触发时,只有在事件停止触发一段时间后才执行一次函数。

函数节流会按照一定的时间间隔持续执行函数,无论事件是否连续触发。

3、响应速度:

函数防抖可能在事件停止后有一定的延迟,因为它等待一段时间以确保事件的停止。

函数节流在每个时间间隔内都会执行函数,因此响应速度更快,但仍受到时间间隔的限制。

4、实现方式:

函数防抖通常使用 setTimeout 来延迟函数的执行,并在每次触发事件时取消之前的延迟。

函数节流通过控制一个标志变量来限制函数的执行,定时器用于重置标志变量。

五、函数防抖和节流的应用场景

函数防抖(Debouncing)和函数节流(Throttling)是在处理高频触发的事件时非常有用的技术,它们可以改善用户体验,提高性能,以及减少不必要的函数执行。以下是它们在实际应用中常见的场景:

函数防抖的应用场景:

  • 输入框实时搜索:当用户在搜索框中输入内容时,防抖可以确保只在用户停止输入一段时间后才触发搜索请求,以减轻服务器负担。

  • 窗口调整大小:在窗口大小调整过程中,防抖可以确保只在用户停止拖动窗口边界后才执行重新布局的操作。

  • 按钮点击防抖:防抖可以用于按钮点击事件,以防止用户多次点击按钮,确保只执行一次点击事件处理函数。

  • 延迟执行:在需要延迟执行某个函数时,防抖可以用于确保只在一定时间内执行一次函数,例如延迟执行动画或提示消息。

  • 滚动事件:在滚动事件处理中,防抖可以用于确保只在用户停止滚动页面一段时间后才执行事件处理函数,减少函数的执行次数。

函数节流的应用场景:

  • 滚动事件:滚动事件可能会频繁触发,使用节流可以限制事件处理函数的执行频率,提高性能。

  • 拖拽操作:在拖拽操作期间,使用节流可以确保只在一定时间间隔内执行拖拽事件处理函数,以平滑处理拖拽操作。

  • 页面滚动加载:在无限滚动页面中,使用节流可以控制加载更多内容的触发频率,避免瞬间加载大量数据。

  • 鼠标移动事件:在处理鼠标移动事件时,使用节流可以减少事件处理函数的执行次数,提高性能。

  • 定时器更新:在需要定时更新某个状态或界面元素时,使用节流可以确保只在一定时间间隔内执行更新操作,避免频繁刷新。

相关文章:

如何精确掌握函数防抖和函数节流的使用?

前序 函数防抖(Debouncing)和函数节流(Throttling)都是用于控制函数执行频率的技术,通常在处理高频率触发的事件(如窗口滚动、鼠标移动、输入框输入等)时非常有用 一、核心概念 函数防抖 函…...

【Linux系列】离线安装openjdk17的rpm包

首发博客地址 首发博客地址[1] 系列文章地址[2] 视频地址[3] 准备 RPM 包 请从官网下载:https://www.oracle.com/java/technologies/downloads/#java17[4] 如需不限速下载,请关注【程序员朱永胜】并回复 1020 获取。 安装 yum localinstall jdk-17_linux…...

Python 没有 pip 包问题解决

最近需要搞一个干净的Python,从官网上直接下载解压可用的绿色版,发现无法正常使用PiP 一 官网下载Python https://www.python.org/downloads/ 选择 embeddable package,这种是免安装的包,解压后可以直接使用。 二 配置环境变量 添加环境变量&#xff1a…...

并发-Java中的锁(二)--- 重入锁ReentrantLock,公平锁,非公平锁笔记

重入锁ReentrantLock 支持重进入的锁,表示该锁能够支持一个线程对资源的重复加锁该锁支持获取锁时的公平和非公平的选择 如果在绝对时间上,先对锁进行获取的请求一定先被满足,那么锁是公平的,获取锁是顺序的。 实现重进入 线程再…...

LeetCode每日一题:1921. 消灭怪物的最大数量(2023.9.3 C++)

目录 1921. 消灭怪物的最大数量 题目描述: 实现代码与解析: 贪心 原理思路: 1921. 消灭怪物的最大数量 题目描述: 你正在玩一款电子游戏,在游戏中你需要保护城市免受怪物侵袭。给你一个 下标从 0 开始 且长度为 …...

SpringBoot连接MySQL数据库,使用Mybatis框架(入门)

1. 说明 SpringBoot项目,连接MySQL数据库,使用Mybatis框架。 本篇文章作为 SpringBoot 使用 Mybatis 的入门。 2. 依赖 2.1. MySQL驱动依赖 MySQL驱动,使用SpringBoot版本对应的默认版本,不需要手动指定版本。 比如&#xf…...

滑动窗口实例6(找到字符串中所有字母异位词)

题目: 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。 示例 1: 输入: s "cbaebabac…...

武林新秀(一)`git init` 初始化一个新的Git仓库

文章目录 命令的概述和用途命令的用法命令行选项和参数的详细说明命令的示例命令的注意事项或提示 命令的概述和用途 git init 是 Git 版本控制系统中用于初始化一个新的 Git 仓库或重新初始化一个现有的仓库的命令。“init” 是 “initialize”(初始化&#xff09…...

gRPC之Interceptor

1、gRPC Interceptor 在应用开发过程中会有这样的需求,就是在请求执行前后做一些通用的处理逻辑,比如记录日志、tracing、身份 认证等,在web框架中一般是使用middleware来实现的,gRPC 在客户端和服务端都支持了拦截器功能&#…...

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 🔥 优质竞赛项目系列,今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖,适合作为竞赛课…...

ELK安装、部署、调试 (七)kibana的安装与配置

1.介绍 Kibana 是一个基于浏览器的开源可视化工具,主要用于分析大量日志,以折线图、条形图、饼图、热图、区域图、坐标图、仪表、目标、时间等形式。预测或查看输入源的错误或其他重大事件趋势的变化。Kibana 与 Elasticsearch 和 Logstash 同步工作&am…...

【Npm】的安装和使用教程

前端工具及插件库 专栏收录该内容 24 篇文章1 订阅 订阅专栏 npm 一、安装配置 二、初始化配置文件 package.json package.lock.json 二、下载模块 2.1、下载指令 2.2、清理缓存 2.3、模块信息 2.4、npm i 与 npm ci 区别 三、其他指令 第三方模块是别人写好的一些文件&#xf…...

22.3D等距社交媒体菜单的悬停特效

效果 源码 <!doctype html> <html><head><meta charset="utf-8"><title>CSS Isometric Social Media Menu</title><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.…...

音视频开发常用工具

文章目录 前言一、VLC 播放器1、简介2、下载3、VLC media player4、VLC 打开网络串流5、VLC 作为流媒体服务器①、搭建 RTSP 流媒体服务器②、新建播放器 二、MediaInfo1、简介2、下载3、MediaInfo①、主界面②、主要功能特点③、使用方法④、Mediainfo 相关参数和含义简介 三、…...

【leetcode 力扣刷题】字符串匹配之经典的KMP!!!

字符串子串匹配相关 28. 找出字符串中第一个匹配项的下标暴力求解KMP 459. 重复的子字符串暴力求解在SS中找S 以下是能用KMP求解的算法题&#xff0c;KMP是用于字符串匹配的经典算法【至今没学懂………啊啊啊】 28. 找出字符串中第一个匹配项的下标 题目链接&#xff1a;28. 找…...

C#的反射机制

介绍 当谈到C#的反射机制时&#xff0c;它提供了一种动态地在运行时获取和操作类型信息的能力。通过反射&#xff0c;可以在编译时未知的情况下&#xff0c;使用类型信息来创建对象、调用方法、访问属性和字段等。下面是一些反射机制的重要概念和用法&#xff1a; Type 类型&a…...

浅谈城市轨道交通视频监控与AI视频智能分析解决方案

一、背景分析 地铁作为重要的公共场所交通枢纽&#xff0c;流动性非常高、人员大量聚集&#xff0c;轨道交通需要利用视频监控系统来实现全程、全方位的安全防范&#xff0c;这也是保证地铁行车组织和安全的重要手段。调度员和车站值班员通过系统监管列车运行、客流情况、变电…...

【LeetCode每日一题合集】2023.8.14-2023.8.20(⭐切披萨3n块披萨)

文章目录 617. 合并二叉树833. 字符串中的查找与替换&#xff08;模拟&#xff09;2682. 找出转圈游戏输家&#xff08;模拟&#xff09;1444. 切披萨的方案数&#xff08;⭐⭐⭐⭐⭐&#xff09;解法——从递归到递推到优化&#xff08;二维前缀和记忆化搜索&#xff09; 1388…...

通过ref 操作dom , 点击按钮后跳转到页面指定图片位置

滚动图片到视图 定义了一个名为 scrollToIndex 的函数&#xff0c;它接受一个参数 index。当按钮被点击时&#xff0c;这个函数会被调用&#xff0c;并根据传入的 index 值来滚动到对应的图片。 以 alt 来标记图片位置 alt“Tom” import { useRef } from "react";c…...

QT 设置应用程序图标

1.下载xx.ico图标&#xff1a;ico网址 2.在线PNG转换ICO&#xff1a;png在线转换ico 3.添加图标资源 1&#xff09;新建文件路径 2&#xff09;添加图片资源 3&#xff09;在 .pro文件里面添加图片 4&#xff09;将xx.ico放到工程目录&#xff0c;编译完可以看到xx.exe的图标…...

WaveTools鸣潮工具箱终极指南:画质优化与抽卡分析的完整解决方案

WaveTools鸣潮工具箱终极指南&#xff1a;画质优化与抽卡分析的完整解决方案 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools鸣潮工具箱是一款专为《鸣潮》玩家设计的强大辅助工具&#xff0c;它…...

如何用dashdot打造高颜值服务器监控面板?完整配置教程

如何用dashdot打造高颜值服务器监控面板&#xff1f;完整配置教程 【免费下载链接】dashdot A simple, modern server dashboard, primarily used by smaller private servers 项目地址: https://gitcode.com/gh_mirrors/da/dashdot dashdot是一款现代化的服务器监控面板…...

RMBG-2.0 API调用教程:Python requests调用+返回透明PNG二进制流解析

RMBG-2.0 API调用教程&#xff1a;Python requests调用返回透明PNG二进制流解析 1. 快速了解RMBG-2.0 RMBG-2.0是一款轻量级的AI图像背景去除工具&#xff0c;它能在保持高精度的同时&#xff0c;大幅降低硬件要求。无论你是开发者还是普通用户&#xff0c;都能轻松上手使用。…...

Fish Speech-1.5语音合成企业标准:WAV采样率/比特率/声道数配置指南

Fish Speech-1.5语音合成企业标准&#xff1a;WAV采样率/比特率/声道数配置指南 如何在企业级应用中配置Fish Speech-1.5的音频输出参数&#xff0c;获得最佳语音合成效果 语音合成技术在企业应用中越来越重要&#xff0c;从智能客服到有声内容制作&#xff0c;都需要高质量的语…...

Qwen3-Reranker-0.6B快速体验:搭建个人语义排序服务的简单方法

Qwen3-Reranker-0.6B快速体验&#xff1a;搭建个人语义排序服务的简单方法 1. 为什么你需要一个轻量级语义排序服务 在信息检索和问答系统中&#xff0c;语义排序&#xff08;Reranking&#xff09;是一个关键环节。想象一下&#xff0c;当用户输入一个问题后&#xff0c;系统…...

Python 入门后进阶:用 Pixel Mind Decoder 完成你的第一个 AI 项目

Python 入门后进阶&#xff1a;用 Pixel Mind Decoder 完成你的第一个 AI 项目 1. 从零开始你的AI项目之旅 刚学完Python基础语法&#xff0c;是不是觉得光写些练习题和小脚本不够过瘾&#xff1f;今天我们就来做个有意思的实战项目——用AI分析文本情绪&#xff0c;再给它套…...

水墨江南模型Python入门实践:第一个AI国画生成程序

水墨江南模型Python入门实践&#xff1a;第一个AI国画生成程序 你是不是也刷到过那些充满诗意的AI水墨画&#xff1f;烟雨朦胧的江南水乡&#xff0c;寥寥几笔勾勒出的远山&#xff0c;那种独特的意境让人过目不忘。你可能觉得&#xff0c;要做出这样的画&#xff0c;得是懂艺…...

Local AI MusicGen开箱即用:WebUI汉化+中文Prompt提示模板集成

Local AI MusicGen开箱即用&#xff1a;WebUI汉化中文Prompt提示模板集成 1. 引言 想不想拥有一个私人AI作曲家&#xff1f;不需要你懂五线谱&#xff0c;也不需要昂贵的编曲软件&#xff0c;只要输入几个词&#xff0c;比如“悲伤的小提琴”或者“赛博朋克电子乐”&#xff…...

570-‘基于坠落机制改进的混沌麻雀算法SSACD‘在23个标准测试函数上可直接运行Matlab语言

570-基于坠落机制改进的混沌麻雀算法SSACD在23个标准测试函数测试可直接运行 Matlab语言 改进点如下&#xff1a; 1.首先&#xff0c;引入Sinusoidal混沌映射和变尺度混沌策略对种群进行初始化&#xff0c;提高种群多样性使算法具备跳出局部最优解的能力 2.其次&#xff0c;引入…...

Base64隐写术逆向工程:从CTF题到自制解密工具(Python实现)

Base64隐写术逆向工程&#xff1a;从CTF题到自制解密工具&#xff08;Python实现&#xff09; 1. Base64编码原理与隐写空间 Base64编码的本质是将二进制数据转换为由64个可打印字符&#xff08;A-Z、a-z、0-9、、/&#xff09;组成的ASCII字符串。每个Base64字符对应6位二进制…...