对于前端工程师来说,节流(throttle)和防抖(debounce)是两个非常重要且常见的概念。它们的目的是减少事件触发的频率,提高性能。在面试中,经常会被要求手写节流和防抖的实现代码。本文将详细解释节流和防抖的原理,并提供一种易于理解和记忆的实现方式,帮助你在面试中脱颖而出。
window.addEventListener('scroll', throttle(handleScroll, 200));按钮点击:对于需要防止用户重复点击提交的按钮,可以使用节流来控制点击频率。例如:
button.addEventListener('click', throttle(handleClick, 500));自动完成(Autocomplete):当用户在搜索框中输入内容时,可以使用节流来控制建议列表的更新频率,避免过于频繁的请求。例如:
input.addEventListener('input', throttle(updateSuggestions, 300));防抖的使用场景
input.addEventListener('input', debounce(sendRequest, 500));窗口大小调整:在窗口大小调整事件中使用防抖,可以避免在调整过程中多次触发事件处理函数,只在调整完成后执行一次。例如:
window.addEventListener('resize', debounce(handleResize, 200));表单验证:对于需要在用户输入内容后进行验证的表单,可以使用防抖来延迟验证的触发,避免过于频繁的验证。例如:
input.addEventListener('input', debounce(validateInput, 300));节流函数的实现
function throttle(fn, delay) { let timer = 0; return function() { if (timer) return; // 堆代码 duidaima.com timer = setTimeout(() => { fn.apply(this, arguments); // 延迟执行函数 timer = 0; // 执行完毕后重置计时器标志 }, delay); } }代码解释:
function debounce(fn, delay) { let timer = 0; return function() { if (timer) { clearTimeout(timer); // 清除之前的定时器 } timer = setTimeout(() => { fn.apply(this, arguments); // 延迟执行函数 timer = 0; // 执行完毕后重置计时器标志 }, delay); } }代码解释:
节流和防抖是前端性能优化的重要技术,它们通过控制事件触发的频率来提高页面性能。节流适用于需要连续触发但要限制执行频率的场景,如滚动事件、按钮点击等;防抖适用于连续触发但只需要执行最后一次的场景,如搜索框输入、窗口大小调整等。