前端性能优化点--防抖节流

news/2025/1/16 0:54:54/

防抖debounce

防抖函数指的是某个函数在某段时间内,无论触发了多少次回调,都只执行最后一次。
假如我们设置了一个等待时间 3 秒的函数,在这 3 秒内如果遇到函数调用请求就重新计时 3 秒,直至新的 3 秒内没有函数调用请求,此时执行函数,不然就以此类推重新计时。

防抖原理示例图

就是当事件触发后开启一个定时器,如果事件在这个定时器限定的时间内再次触发,则清除定时器,再写一个定时器,定时时间到则触发。 

function debounce(fn, delay){let timer = null;return function(){clearTimeout(timer);timer = setTimeout(()=> {fn.apply(this, arguments);}, delay)}
}

节流throttle

函数节流指的是某个函数在一定时间间隔内(例如 3 秒)执行一次,在这 3 秒内 无视后来产生的函数调用请求。 

防抖原理示例图

即可以设计一种类似控制阀门一样定期开放的函数,事件触发时让函数执行一次,然后关闭这个阀门,过了一段时间后再将这个阀门打开,再次触发事件。

function throttle(fn, delay){let valid = true;return function(){if(valid) { //如果阀门已经打开,就继续往下setTimeout(()=> {fn.apply(this, arguments);//定时器结束后执行valid = true;//执行完成后打开阀门}, delay)valid = false;//关闭阀门}}
}
// 刚开始valid为true,然后将valid重置为false,进入了定时器,在定时器的时间期限之后,才会将valid重置为true,valid为true之后,之后的点击才会生效
// 在定时器的时间期限内,valid还没有重置为true,会一直进入return,就实现了在N秒内多次点击只会执行一次的效果//用法:
function fn(value){console.log(value);
}
var throttleFunc = throttle(fn,2000);//节流函数//事件处理函数,按钮点击事件
btn.addEventListener("click",function(){    throttleFunc(Math.random());// 给节流函数传参
})

应用场景

防抖

  • search搜索联想,用户在不断输入值时,用防抖来节约请求资源
  • window触发resize的时候,不断的调整浏览器窗口大小会不断的触发这个事件,用防抖来让其只触发一次

节流 

  • 鼠标不断点击触发,mousedown(单位时间内只触发一次)
  • 监听滚动事件,比如是否滑到底部自动加载

总结

相同点

防抖和节流都是为了阻止操作高频触发,从而浪费性能

区别

  • 防抖是触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。适用于可以多次触发但触发只生效最后一次的场景
  • 节流是高频事件触发,但在n秒内只会执行一次,如果n秒内触发多次函数,只有一次生效,节流会稀释函数的执行频率

http://www.ppmy.cn/news/53706.html

相关文章

两数之和hash

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

python内置数据结构常见操作易错总结[更新ing...]

list 常用方法 切片->使用一个冒号 间隔->使用两个冒号 a [1,2,3,4,5] print(a[-3:]) # [3,4,5] print(a[::2]) # [1,3,5] print(a[1:5:2]) # [2,4]添加元素 lst.append(value):一次添加一个元素lst,insert(index,value):在索引为index的位置…

解决播放swf视频提示“该版本过旧,不支持运行,请升级后使用”的问题

解决播放swf视频提示“该版本过旧,不支持运行,请升级后使用”的问题 1、修改hosts文件2、提升编辑hosts文件的权限3、独立播放器,也就是运行本地SWF的情况清理配置文件“settings.sol”(安全方法)删除Macromedia目录&a…

ts定义对象类型Record<string, any>;和object、Object的区别

Record Record 是 TS 内置的一个高级类型&#xff0c;是通过映射类型的语法来生成索引类型的&#xff1a; type Record<K extends string | number | symbol, T> { [P in K]: T; } 比如传入 a | b 作为 key&#xff0c;1 作为 value&#xff0c;就可以生成这样索引类…

蒸发器前氟离子超标的解决方法

深度除氟工艺 1、活性氧化铝&#xff1a;需PH调整至酸性 2、碳基/羟基磷灰石&#xff1a;再生次数有限制 3、反渗透膜&#xff1a;造价成本高 4、特种除氟树脂&#xff1a;预处理需做好 氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性…

PostgreSQL 数据类型转换

各种数据类型&#xff08;日期/时间、integer、floating point和numeric&#xff09;转换成格式化的字符串及反过来从格式化的字符串转换成指定的数据类型&#xff0c;在实际操作中经常遇到。下面总结了一些常用的函数。 日期操作函数 函数返回类型描述实例to_char(timestamp…

ES7.x的查询语句及java查询语句

文章目录 ES 简介基本信息查询查看所有索引查看索引 mapping查索引中所有值过滤模糊查询去重过滤后去重 ES 简介 Elasticsearch 7.x 是一个基于 Lucene 的分布式搜索引擎&#xff0c;它提供了一个分布式全文搜索引擎&#xff0c;可以快速、准确地搜索、分析和存储海量数据。El…

什么是gpt4-如何用上gpt-4

gpt4主要强化了哪些功能 OpenAI尚未公布GPT-4的详细信息&#xff0c;不过可以根据OpenAI前CEO Sam Altman在2020年所发表的一篇博客中提到的&#xff0c;GPT-4可能会具有更强大和智能的能力&#xff0c;包括更准确的理解和表达自然语言、更高效的记忆和推理、更全面的知识和视…