函数节流与防抖的实现
节流:
高频事件不断触发,每隔一定时间会执行一次,会稀释高频事件;
实现原理:在闭包内设置一个标记,初始值为true,若标记为false,则退出函数,不执行,若标记值为true,马上将标记变成false;并且执行一个定时器,在定时器内执行回调函数,并且将标记设置为true;
具体代码:
function throttle(fn,time){ var canrun = true;//通过闭包保存一个标记 return function(){//返回一个函数 if(!canrun) return;//如果不在执行时间内 则不执行 canrun = false;//如果在执行时间内 马上将标记改为false 然后执行后续代码 setTimeout(() => { // 执行时间结束时 执行函数 并且将标记设置为可执行 fn.apply(this,arguments); canrun = true; },time); }; }
测试代码:
let dom = document.getElementsByClassName("content")[0]; var log2 = throttle(log,2000);//把log函数变成一个节流函数 dom.addEventListener("click",function(){ log2(222); }) function log(num){ console.log(num); }
防抖:
高频事件触发时,在一定时间内函数只会触发一次,如果不停触发,那么久只执行一次,不会隔一段时间执行一次,除非中间停止足够的时间,才会触发第二次;
实现原理:在闭包内定义一个变量,次变量用来存放定时器,执行函数时会先清除上一个定时器,然后重新设置一个定时器,定时器内执行回调函数,如果一直触发,就会不断的清除计时器,函数就不会执行;
具体代码:
function debounce(fn,time){ let timeout = null; return function(){ clearTimeout(timeout); //清除定时器 定时器清除后,内部的函数就不会执行 timeout = setTimeout(() => {//重新设置定时器 fn.apply(this,arguments);//执行函数 }, time); } }
测试代码:
let dom = document.getElementsByClassName("content")[0]; var log2 = debounce(log,2000);//把log函数变成防抖函数 dom.addEventListener("click",function(){ log2(222); }) function log(num){ console.log(num); }
总结一下,节流函数和防抖函数在高频事件不断触发时会有明显区别;节流函数会稀释高频事件,而防抖会阻断,事件不停,函数就不会执行
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2020-08-10 vue图片点击放大预览v-viewer
2019-08-10 nginx初步学习
2019-08-10 vue项目,前端导出excel