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

JS的防抖与节流

一、简介

JavaScript中的防抖与节流是两种优化高频执行函数(如:click、keydown、mousemove、resize事件等)的方法,主要用于控制函数执行的频率,从而减少不必要的资源消耗,提高页面性能。

二、防抖(Debounce)

概念:当事件被连续触发时,只有在最后一次触发事件后的延迟时间内没有再次触发,才会执行目标函数(即:事件被触发后,不会立即执行该事件的回调函数,若在该事件的延迟时间内,没有再触发该事件,则执行该事件的回调函数)

例:假设一个事件的延迟时间是3秒,当触发了该事件,则它的回调函数会在3秒后执行;
在这延迟的3秒期间,如果又触发了该事件,则会重新开始计时3秒钟; 如果又触发,就再重新计时,再触发,再重新计时…;
直到距离事件的触发时间(延迟时间),大于3秒钟,才会执行该事件的回调函数;

// 防抖函数
export function debounce(fn, wait){let timer = nullreturn function(...args) {if (timer) clearTimeout(timer)timer = setTimeout(() => fn.apply(this, args), wait)}
}

三、节流(Throttle)

概念:当事件被连续触发时,在设定的一段时间内,只执行一次该事件的回调函数(即:执行一次事件的回调函数后,等到间隔时间结束,若再触发该事件,才会再执行该事件的回调函数)

例:假设一个事件的间隔时间是3秒,当第一次触发了该事件,会执行该事件的回调函数, 3秒间隔内,再触发该事件,并不会再执行该事件的回调函数;
直到3秒钟过后,再触发该事件,才会再执行该事件的回调函数;

// 节流函数
export function throttle(fn, delay){let lastCall = 0return function(...args) {const now = new Date().getTime()if (now - lastCall < delay) returnlastCall = nowfn.apply(this, args)}
}

注:还可以使用lodash库的debounce, throttle函数

// import { debounce, throttle } from '@/utils/tools'
import { debounce, throttle } from 'lodash'
......
methods: {// 节流handle1: throttle(function () {console.log(Math.random())}, 3000),// 防抖handle: debounce(function () {console.log(Math.random())}, 2000)},mounted() {// 传递函数引用,而非调用结果window.addEventListener('resize', this.handle)window.addEventListener('scroll', this.handle1)},beforeDestroy() {// 记得移除监听器,避免内存泄漏window.removeEventListener('resize', this.handle)window.removeEventListener('scroll', this.handle1)}
http://www.xdnf.cn/news/15505.html

相关文章:

  • 实例操作:基于 PipeLine 实现 JAVA项目集成 SonarQube代码检测通知 Jenkins
  • 基于R、Python的Copula变量相关性分析
  • 开源 python 应用 开发(七)数据可视化
  • 网络编程/Java面试/TCPUDP区别
  • Spring Boot 解决跨域问题
  • langchain--1--agent示例
  • AWS权限异常实时告警系统完整实现指南
  • 动态规划题解——分割等和子集【LeetCode】
  • Spring Boot 缓存 与 Redis
  • WPF 多窗口分文件实现方案
  • 网络安全(初级)(XSS-labs 1-8)
  • flink sql如何对hive string类型的时间戳进行排序
  • APIs案例及知识点串讲(上)
  • Jenkins全方位CI/CD实战指南
  • 向量数据库Faiss vs Qdrant全面对比
  • 理解大模型的对话和检索能力
  • JWT基础详解
  • 外网访问禅道软件项目管理系统,简单几步将本地内网IP端口设置互联网在线用
  • YOLO13正式发布!考虑将yolov13的创新点融合到半监督中,构建YOLOv13_ssod
  • MySQL 备份与恢复指南
  • 力扣-使用双指针的方法的题们(持续更新中。。。
  • Java全栈工程师面试实录:从电商支付到AI大模型的应用场景与技术栈解析
  • nlp论文:分本分类:《Bag of Tricks for Efficient Text Classification》
  • Pytorch中张量的索引和切片使用详解和代码示例
  • [ROS 系列学习教程] ROS动作通讯(Action):通信模型、Hello World与拓展
  • B/S 架构通信原理详解
  • 【数据结构】单链表练习(有环)
  • C++(STL源码刨析/stack/queue/priority_queue)
  • Rocky Linux 9 源码包安装php8
  • I3C通信协议核心详解