如何在项目中实现一个防抖函数?
JavaScript防抖实现方案:
function debounce(func, wait = 300, immediate = false) {
let timeout
return function executedFunction(...args) {
const context = this
const later = () => {
timeout = null
if (!immediate) func.apply(context, args)
}
const callNow = immediate && !timeout
clearTimeout(timeout)
timeout = setTimeout(later, wait)
if (callNow) func.apply(context, args)
}
}
核心特性:
使用示例:
// 输入框搜索建议
const searchInput = document.querySelector('#search')
const fetchSuggestions = debounce((query) => {
console.log('发起请求:', query)
}, 500)
searchInput.addEventListener('input', (e) => fetchSuggestions(e.target.value))
// 窗口resize监听
window.addEventListener('resize', debounce(() => {
console.log('窗口尺寸稳定后执行')
}, 200))
实现要点:
与节流(throttle)的区别:
防抖关注最后一次触发后的延迟执行,而节流保证固定时间间隔最多执行一次。根据场景需求选择合适方案。
防抖(Debounce)是一种优化技术,用于限制函数在短时间内多次触发。
示例代码:
function debounce(func, delay) {
let timer;
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}
window.addEventListener('resize', debounce(() => {
console.log('Window resized');
}, 300));
口语化解释:防抖函数会在事件触发后等待一段时间,如果在这段时间内事件再次触发,则重新计时。这样可以避免频繁触发函数,比如在窗口调整大小时。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决