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

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.dtcms.com/a/283300.html

相关文章:

  • Javase总体回顾
  • EP01:【NLP 第二弹】自然语言处理概述
  • Postman接口
  • 代码随想录算法训练营第二十二天
  • AI编程神器 Claude Code 安装及使用体验
  • 横向移动(下)
  • RAG测试用例集的构造(Ragas的用法)
  • cell2location复现
  • MySQL基础学习之DML,DQL(二)
  • 访问继承成员(C++)
  • C语言数据存储与指针
  • 选择亿林数据软件测试服务,为哈尔滨企业数字化转型赋能
  • Rust入门之并发编程基础(三)
  • CSS全面系统教程:从入门到精通网页样式设计
  • Datawhale AI夏令营笔记-TF-IDF方法
  • 深度学习入门-卷积神经网络(CNN)
  • JS修改布局--两列布局,拖拽中间修改左右的宽度
  • GI6E 打破網路封鎖:保護你的通信身份安全
  • AI Agent开发学习系列 - langchain之LCEL(2):LCEL 链式表达解析
  • Java对象的比较
  • 产品更新丨谷云科技 iPaaS 集成平台 V7.6 版本发布
  • C++面向对象创建打印算术表达式树
  • Spring Boot 源码解析之 Logging
  • Vue加密文章密码 VuePress
  • xss-labs靶场(1-5关)
  • 从零开始学习 Redux:React Native 项目中的状态管理
  • 数据结构-1(顺序表)
  • kafka--基础知识点--0
  • 智慧农业新图景:物联网如何精准守护作物生长​
  • 第六届信号处理与计算机科学国际学术会议(SPCS 2025)