防抖和节流是JS用来处理在一定时间内重复出现一个操作的时候采取的策略。
/** * 防抖函数:在一定时间内多次执行相同的操作,在每次操作后都会重新执行; * 设计思路: * 1.防抖函数会在执行的时候清楚计时器的ID,并且重新执行至此这个操作; * 2.我们就必须使用闭包延长作用域链,让下次的函数的执行时也获取到上次的的计时器的ID。 * */ function debounce(fun, delay) { let timer; return function(args) { clearTimeout(timer) timer = setTimeout(function () { fun(args); }, delay); }; } const inputFun = function(value) { console.log(value); }; const debounceInput = debounce(inputFun, 1000) document.getElementById("in").addEventListener("keyup", function (e) { debounceInput(e.target.value); });
节流函数:
/** * 节流函数是指在一定时间内只会执行一次代码; * 设计思路: * 1.首先我们设计一个节流阀,在当timer为false的话就能执行计时器的方法 * 2.为timer赋值,并在计时器内部将timer修改为false * 3.使用闭包将timer的作用域延长 * */ function throttle(fun, wait) { let timer; return function () { if (!timer) { timer = setTimeout(function () { timer = false; fun(); }, wait); } }; } const btn = document.getElementById("btn"); function btnClick() { console.log("这个btn被点击了"); } const throttleBtn = throttle(btnClick, 1000); btn.addEventListener("click", function () { throttleBtn() })
(ps:并且在这里出现了一个小插曲,我在书写防抖函数的时候为了方便就没有命名变量,都是直接函数式编程,结果并不能起到防抖函数的作用,据我分析是因为没有分开写,导致每次都会重新执行新的计时器方法,timer也就会不一样,所以并没有起到作用)