简单的了解一下前端开发中的防抖和节流。
概念
在现实情况里我们可能碰到这样的问题:
- 用户在搜索的时候,在不停敲字,如果每敲一个字我们就要调一次接口,接口调用太频繁,给卡住了。
- 用户在阅读文章的时候,我们需要监听用户滚动到了哪个标题,但是每滚动一下就监听,那样会太过频繁从而占内存,如果再加上其他的业务代码,就卡住了。
这时候,我们可以抛出防抖和节流的概念了:
- 防抖:任务频繁触发的情况下,只有任务触发的间隔超过指定间隔的时候,任务才会执行。
- 节流:指定时间间隔内只会执行一次任务。
特点
实现原理
防抖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>debounce</title> </head> <body> <button id="debounce">点我防抖!</button>
<script> window.onload = function() { var myDebounce = document.getElementById("debounce"); myDebounce.addEventListener("click", debounce(sayDebounce)); }
function debounce(fn) { let timeout = null; return function() { clearTimeout(timeout); timeout = setTimeout(() => { fn.call(this, arguments); }, 1000); }; }
function sayDebounce() { console.log("防抖成功!"); }
</script> </body> </html>
|
节流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>throttle</title> </head> <body> <button id="throttle">点我节流!</button>
<script> window.onload = function() { var myThrottle = document.getElementById("throttle"); myThrottle.addEventListener("click", throttle(sayThrottle)); }
function throttle(fn) { let canRun = true; return function() { if(!canRun) { return; } canRun = false; setTimeout( () => { fn.call(this, arguments); canRun = true; }, 1000); }; }
function sayThrottle() { console.log("节流成功!"); }
</script> </body> </html>
|
总结
防抖和节流是前端开发中很基础的技能,理解并善用很重要。