JavaScript实现防抖节流函数
review
防抖函数
防抖函数一般是短时间内多次触发,但是只有最后一次触发结束后的delay秒内会去执行相对应的处理函数。
相当于一个赛道里面一次只能跑一辆赛车,如果此时已经有一辆赛车在跑道里面跑,但是又进来了一辆,那么之前那一辆赛车就会被清空。知道有一辆赛车到达终点,然后执行函数。
也就是说,防抖函数多次触发,但是一段时间内触发的n次,最后只能有一次会执行。
节流函数
节流函数如果也用赛车的案例来举例,就是说:
一个赛道里面,如果此时已经有了一辆赛车,那么其他想要进入赛道的赛车就会被阻止,直到前一辆赛车进去以后,才会被允许进入一辆新赛车。
下面的代码中我实现了两种版本的节流函数:
- 第一次触发立即执行(使用时间戳)
- 第一次触发,需要等待delay秒之后才执行
code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>防抖节流</title> <style> div { width: 300px; height: 300px; background: #000; } </style> </head> <body> <input type="text"> <div></div> </body> <script> const input = document.getElementsByTagName('input')[0]; input.addEventListener('input', queryD(dosomething, 2000)); function dosomething() { console.log('do some thing'); } // 防抖函数(触发后delay秒内不能再触发,否则重新计时) // 可以应用于需要频繁发送请求的场景下 function queryD(func, delay) { console.log('in query d'); let time = null return function () { clearTimeout(time); time = setTimeout(func, delay); } } //---------------------------------------------------- const div = document.querySelector('div'); div.addEventListener('touchmove', cost(dosomething, 500)); div.addEventListener('touchmove', useDate(dosomething, 500)); // 节流函数(一段时间内只能发生一次) // 第一次执行也需要在delay秒之后 function cost(func, delay) { let time = null; return () => { if (!time) { time = setTimeout(() => { func(); time = null; }, delay); } } } // 使用date实现节流函数 // 可以立即执行,下一次执行需要等待delay秒之后 function useDate(func, delay) { let time = new Date().getTime(); return () => { const cur = new Date().getTime(); if (cur - time > delay) { time = cur; func(); } } } </script> </html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通