当前位置:网站首页>JS函数防抖&函数节流及其使用场景
JS函数防抖&函数节流及其使用场景
2022-08-02 21:11:00 【小孟童学】
JS防抖&节流函数及其使用场景
1、防抖函数概念
函数防抖是优化高频率执行JS代码的一种手段【永远在执行最后一次】
其中如:浏览器的resize、scroll,鼠标的mousemove、mouseover等事件在触发时会不断绑定事件上的回调函数,浪费资源、降低性能,这时需要用防抖函数来进行调用次数的限制。
(1)使用场景及函数样式
回到顶部、立即(实时)搜索、输入框搜索自动补全事件、频繁点赞&取消点赞等
//防抖函数 重点【必须清理定时器】
function debounce(callback,time = 400){
// 设置定时器时间为400ms
let t;
return function(){
clearTimeout(t);
t = setTimeout(callback,time);
}
}
//绑定滚动条事件
window.onscroll = debounce(function(){
console.log("调用了一次"); //注:log("要执行的事件")
},500); // 限制500ms执行一次
实现原理:如果在500ms内频繁操作事件,则每次都会清除一次定时器然后重新创建一个。直到最后一次操作事件,然后等待500ms后进行处理
(2)作用
当有些事件触发频率太高,浏览器来不及处理会造成浏览器卡顿、掉帧等
2、节流函数概念
函数防抖是优化高频率执行JS代码的一种手段
其中如:浏览器的resize、scroll,鼠标的mousemove、mouseover等事件在触发时会不断绑定事件上的回调函数,浪费资源、降低性能,这时需要用防抖函数来进行调用次数的限制。
(1)使用场景及函数样式
onrize、onscroll等频繁触发的函数,比如获取滚动条的位置然后执行下一步事件
// 节流函数 重点【最后必须重新赋值】
function throlle( callback,time){
let lasttime = new Date().getTime();
return function(){
let now = new Date().getTime();
if(now - lasttime > time){
callback();
lasttime = now;
}
}
}
window.onscroll = throlle(function(){
console.log("调用了一次");
},100);
实现原理:在一定时间间隔内只执行一次,在这段时间内无视后来产生的函数调用请求
(2)作用
当有些事件触发频率太高,浏览器来不及处理会造成浏览器卡顿、掉帧等
3、函数防抖&节流的区别
①相同点
都可以通过setTimeout实现,目的都是降低回调执行频率,节省资源,提高性能,前提都是频繁触发
②不同点
防抖:在一段连续操作结束后处理回调,将多次触发变为一次触发,一定时间内连续触发的事件只在最后一次执行
节流:减少一段时间的触发频率,一段连续操作中每一段时间只执行一次,侧重于一段时间内只执行一次
触发,一定时间内连续触发的事件只在最后一次执行
节流:减少一段时间的触发频率,一段连续操作中每一段时间只执行一次,侧重于一段时间内只执行一次
边栏推荐
猜你喜欢
"Weekly Translate Go" This time we have something different!-- "How to Code in Go" series launched
工厂模式理解了没有?
[c] Detailed explanation of operators (1)
Zabbix 5.0 监控教程(二)
Zabbix 5.0 Monitoring Tutorial (2)
Packages and packages, access modifiers
X 2 Earn必须依靠旁氏启动?GameFi的出路在哪?(下)
汉源高科2光12电千兆导轨式网管型工业以太网交换机双光自愈保护式以太网光交换机
.NET performance optimization - you should set initial size for collection types
Bee 事务注解 @Tran 使用实例
随机推荐
Zabbix 5.0 监控教程(二)
golang 刷leetcode:从栈中取出 K 个硬币的最大面值和
性能测试 - 理论
宝塔搭建实测-基于ThinkPHP5.1的wms进销存源码
A brief discussion on the transformation of .NET legacy applications
Informatics orsay a tong (1258: 【 9.2 】 digital pyramid)
如何抓住NFT、元|宇|宙新趋势?
解道8-编程技术5
C语言中变量在内存中的保存与访问
Intensive reading of the Swin Transformer paper and analysis of its model structure
终于明白:有了线程,为什么还要有协程?
LeetCode 2360. 图中的最长环 基环树找环+时间戳
【STM32学习2】存储器相关概念与操作
包管理工具npm- node package management相关知识 、检查包更新、NPM包上传、更换镜像、npm ERR! registry error parsing json
golang刷leetcode:我能赢吗
Do you understand the factory pattern?
矩阵白化原理及推导
【STM32学习3】DMA基础操作
【干货】分库分表最佳实践
go——内存分配机制