【前端每日基础】day32——节流和防抖

节流(Throttle)和防抖(Debounce)是两个在前端开发中常用的技术,它们用于控制某些函数的执行频率,以提升性能和用户体验。虽然两者的目标相似,但实现方式和适用场景有所不同。

一、节流(Throttle)

  1. 定义
    节流是一种在一定时间间隔内只允许某个函数执行一次的方法。如果在这个时间间隔内多次调用函数,只有一次会生效,其余的调用会被忽略。

  2. 适用场景
    节流适用于那些在一段时间内会频繁触发的事件,但又不需要每次都响应的场景。例如:

滚动事件(scroll)
窗口调整大小事件(resize)
鼠标移动事件(mousemove)
3. 实现原理
节流的实现通常有两种方式:时间戳方式和定时器方式。

时间戳方式:

function throttle(func, wait) {//参数为要执行函数和间隔时间let previous = 0;//用于记录上次执行时间return function(...args) {//匿名函数,rest参数用法,arg数组存储了throttle参数,用于下次调用const now = Date.now();//本次调用时间戳if (now - previous > wait) {//判断两次调用时间间隔是否过短previous = now;//更新时间戳func.apply(this, args);//}};
}

时间戳是一个表示某个时刻的数字,通常是从1970年1月1日00:00:00 UTC到当前时刻的毫秒数。Date.now()方法返回当前的时间戳。

apply 是 JavaScript 中的一个函数方法,用于调用一个函数,并且可以指定函数的执行上下文 (this 值) 以及参数数组。它是 Function 对象的一个方法,与 call 方法类似,但它接受参数数组而不是单个参数。
func.apply(thisArg, [argsArray])

定时器方式:

function throttle(func, wait) {let timeout = null;return function(...args) {if (!timeout) {timeout = setTimeout(() => {timeout = null;func.apply(this, args);}, wait);}};
}

二、防抖(Debounce)

  1. 定义
    防抖是一种在函数调用后一定时间内不再调用该函数的方法。也就是说,如果在这段时间内再次调用该函数,则重新计时,只有在这段时间结束后,函数才会被执行。

  2. 适用场景
    防抖适用于那些在一段时间内会频繁触发的事件,但又希望最终只执行一次的场景。例如:

搜索框输入(input)联想
表单验证
浏览器窗口大小调整(resize)
3. 实现原理
防抖的实现通常使用定时器。

基本实现:

function debounce(func, wait) {let timeout;return function(...args) {clearTimeout(timeout);timeout = setTimeout(() => {func.apply(this, args);}, wait);};
}

三、对比与总结
控制频率方式不同:

节流:保证在一定时间内执行一次,无论触发频率多高。
防抖:在一定时间内不再触发,若在这段时间内再次触发,则重新计时。

适用场景不同:

节流适用于频繁触发但需要定期执行的场景。
防抖适用于频繁触发但只需执行一次的场景。

实现方式不同:

节流可以通过时间戳或定时器实现。
防抖通常通过定时器实现。
四、例子
节流示例
应用于页面滚动事件:

window.addEventListener('scroll', throttle(() => {console.log('Scroll event handler called');
}, 100));

防抖示例
应用于输入框搜索建议:

const searchInput = document.getElementById('search');
searchInput.addEventListener('input', debounce(() => {console.log('Input event handler called');
}, 300));

通过合理使用节流和防抖技术,可以有效提升前端应用的性能和用户体验,避免不必要的资源浪费和重复执行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安规介绍】

文章目录 一、基础知识安规上的六类危险的防护:安全电压漏电流接触电流能量问题:火灾问题:热问题结构问题阻燃等级绝缘等级:对接地系统的要求:结构要求:电气要求: 二、设计的关键电气绝缘距离电气爬电距离:…

Python 关于加密和解密

1、理解 加密是通过使用各种加密算法来对数据进行加密和解密的过程。Python 提供了许多内置库和第三方库,可以用于实现各种加密算法和技术,包括对称加密、非对称加密、哈希函数等。以下是 Python 中常用的一些加密相关的库和模块: hashlib …

Python知识点14---被规定的资源

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 在Python中被规定的东西不止有常识中的那些关键字、构造器等编程语言…

Python知识点4---循环语句

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python支持两种循环for和while,但是他们和其他的语言有些…

乡村振兴与农村环境整治:加强农村环境治理,改善农村人居环境,打造干净整洁、生态宜居的美丽乡村

目录 一、引言 二、农村环境整治的重要性 1、提升农民生活质量 2、促进农村经济发展 3、保护农村生态环境 三、当前农村环境面临的问题 1、垃圾处理不当 2、污水处理设施缺乏 3、农业面源污染严重 四、加强农村环境治理的措施 1、完善农村垃圾处理体系 2、加强农村…

14.Ollydbg的基本使用

上一个内容:13.优化界面化的游戏辅助 Ollydbg是一个调试工具,它可以一步一步的运行一个程序并且还能很直观的看到被调试程序的寄存器状态、栈状态。Ollydbg需要以管理员方式运行! 下图附加程序是调试一个正在运行的进程: 点击了…

STM32F103借助ESP8266连接网络

ESP8266配置 STM32F103本身是不具备联网功能的,所以我们必须借助其他单片机来进行联网,然后让STM32与联网单片机通信,就可以实现STM32联网了。 本文借助的是ESP8266模块,其通过UART协议与STM32通信(http://t.csdnimg.c…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑动态定价的新能源汽车能源站优化运行》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Nacos-SpringBoot-配置中心

Nacos配置中心 前情回顾 上一章呢 了解并且学习了Nacos服务注册与发现 在一系列破防中走了出来Nacos服务注册完成https://blog.csdn.net/m0_68711597/article/details/139265244?spm1001.2014.3001.5502 本以为接下来会一帆风顺 一马平川 没想刚出坑 又入坑 Nacos的配置…

Prime1 - 信息收集和分析能力的试炼

主机发现 nmap扫描与分析 端口22、80 详细扫描;linux、ubuntu、 udp扫描 端口都是关闭的 脚本扫描 web渗透 打开只有一张图片;源码有图片和一个alt:hnp security不知道有啥用,先记录下来吧 继续web渗透思路走吧,目录…

[Python]用Qt6和Pillow实现截图小工具

本文章主要讲述的内容是,使用python语言借助PyQt6和Pillow库进行简单截图工具的开发,含义一个简单的范围裁剪和软件界面。 主要解决的问题是,在高DPI显示屏下,坐标点的偏差导致QWidget显示图片不全、剪裁范围偏差问题。 适合有一点…

vivado BD_ADDR_SEG

按字母顺序排列的一类对象列表 BD_ADDR_SEG 描述 地址段或bd_addr_seg对象描述一个范围的位置和大小记忆力它们有一个范围(大小)和一个可选的起始偏移。对于各种内存映射的主接口和从接口,IP集成商遵循行业用于捕获存储器要求和能力的标准IP-…

爬楼梯 - LeetCode 热题 81

大家好!我是曾续缘😇 今天是《LeetCode 热题 100》系列 发车第 81 天 动态规划第 1 题 ❤️点赞 👍 收藏 ⭐再看,养成习惯 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法…

Android Kotlin 打开相册选择图片(多选)

1. 核心代码 打开系统相册功能,本代码使用两种方式打开本地相册,startActivityForResult 已经废弃,可以使用新的方式。 package com.example.facedetectordemoimport android.content.pm.PackageManager import androidx.appcompat.app.App…

【人工智能004】文本挖掘算法模型实战及经验总结(最近更新中)

1.熟悉、梳理、总结数据分析实战中的文本挖掘领域实战研发知识体系,这块领域很大,需要耗费很多精力,逐步总结、更新到位,,, 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来&am…

数据库与缓存⼀致性⽅案

数据库与缓存⼀致性⽅案 1、背景2、数据⼀致性⽅案设计3、数据⼀致性⽅案流程图4、关键代码4.1、 处理数据⼀致性的消息队列⼊⼝4.2、数据⼀致性配置的常量信息 1、背景 现有的业务场景下,都会涉及到数据库以及缓存双写的问题,⽆论是先删除缓存&#xf…

【Bug】修改计算机名称出现ip无法连接mysql数据库

解决: mysql -u root -p输入密码登录mysql服务器,那个ip是本机ip4的地址单ip放行。推荐全部,后面123456是密码 GRANT ALL PRIVILEGES ON *.* TO root192.168.0.109 IDENTIFIED BY 123456; 全部IP都放行 GRANT ALL PRIVILEGES ON *.* …

【移动端】商场项目路由设计

1:路由设计配置: 一级路由配置 分析项目,设计路由,配置一级路由 一级路由:单个页面独立展示的,都是一级路由,例如:登录页面,首页架子,报错页面 二级路由&…

Pycharm编辑器下自定义模块导入报错:no module named问题

相信很多使用pycharm 社区版编写python 程序的初学者都会遇到这样一个看似简单但是一时半刻找不到解决头绪的问题: 在同个目录下导入自己编写的模块到主程序的过程中,直接import的时候会报错:ModuleNotFoundError。 通过各种方法尝试以后还是…

美业SaaS收银系统源码-已过期卡项需要延期怎么操作?美业系统实操

美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1.询问会员手机号和需要延期的卡项 2.PC运营后端-数据导入-修改已售卡项,搜索手机号 3.把需要卡项选…