Debounce do Zero em JavaScript: Otimizando Digitação em Tempo Real
O debounce é uma técnica essencial para adiar a execução de uma função até que um determinado período de inatividade tenha decorrido desde a sua última chamada. Essa abordagem resolve o problema de sobrecarga em APIs e travamentos de performance causados por disparos excessivos de eventos frequentes, como chamadas de busca ao digitar (input) ou redimensionamento de tela (resize).
JavaScript
// Função genérica de Debounce
function debounce(fn, delay = 300) {
let timer;
return function (...args) {
// Cancela o agendamento anterior se uma nova chamada ocorrer dentro do intervalo
clearTimeout(timer);
// Agenda a execução da função callback após o tempo definido
timer = setTimeout(() => {
fn.apply(this, args);
}, delay);
};
}
// --- Exemplo de Uso Prático ---
// Função pesada que simula uma requisição de busca
function buscarResultados(termo) {
console.log(`[API Request] Buscando por: "${termo}" às ${new Date().toLocaleTimeString()}`);
}
// Cria uma versão otimizada da função com espera de 500ms
const buscarComDebounce = debounce(buscarResultados, 500);
// Simulação de digitação rápida do usuário
console.log("Usuário começa a digitar...");
buscarComDebounce("J");
buscarComDebounce("Ja");
buscarComDebounce("Java");
buscarComDebounce("JavaScript");
// Apenas o último termo ("JavaScript") será processado após 500ms de pausa.
- Uso de Closures e Timer: A função interna mantém a referência à variável
timermesmo após a execução dedebounce(), garantindo o controle do ciclo de vida do temporizador entre chamadas consecutivas. - Uso de
clearTimeout: Limpa o agendamento pendente toda vez que o evento dispara novamente antes do término do tempo limite (delay), reiniciando a contagem do zero. - Preservação de Contexto e Argumentos: O uso de
fn.apply(this, args)garante que othiscorreto e todos os argumentos originais repassados à função empacotada sejam mantidos durante a execução do callback. - Parâmetro Default (
delay): Definir um tempo de espera padrão (ex:300msa500ms) garante uma boa experiência visual ao usuário sem comprometer a performance do servidor/navegador. - Pegadinha Comum: Lembre-se de não instanciar a função
debouncedentro de handlers de eventos reativos (como componentes React semuseCallback), pois isso recriará o timer a cada renderização, anulando o efeito de retenção.
