0Pricing
JavaScript Academy · Lezione

Debounce e throttle — implementazione manuale

Costruisci piccole utility di debounce e throttle. Fai pratica con le varianti trailing e leading e impari quando scegliere ciascuna.

Debounce e throttle — implementazione manuale è una lezione JavaScript Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento JavaScript Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso JavaScript Academy include 3 lezioni in totale.

Panoramica

Obiettivo: controllare gli eventi frequenti.

  • Debounce: attende che non ci siano più eventi, poi esegue una volta
  • Throttle: esegue al massimo una volta per intervallo
  • Chiamate leading e trailing
  • Helper piccoli e leggibili
Debounce e throttle — implementazione manuale — illustrazione 1

Debounce (trailing)

Il debounce trailing reimposta un timer a ogni evento ed esegue una volta quando la situazione si calma.

// Debounce (trailing): run once after events stop
function debounce(fn, wait) {
  let t = null;
  return function (...args) {
    clearTimeout(t);
    t = setTimeout(function () {
      fn.apply(null, args);
    }, wait);
  };
}

// Simulate rapid events: only the last triggers the call
const debouncedLog = debounce(function (msg) {
  console.log("debounced:", msg);
}, 10);

for (let i = 0; i < 5; i++) {
  setTimeout(function () {
    debouncedLog("final after bursts");
  }, i * 3);
}
Debounce e throttle — implementazione manuale — illustrazione 2

Debounce (leading)

Il debounce leading si attiva immediatamente, poi blocca le ripetizioni fino al termine dell'intervallo di quiete.

// Debounce (leading): first call fires immediately, then ignore until quiet
function debounceLeading(fn, wait) {
  let t = null;
  return function (...args) {
    if (t === null) {
      fn.apply(null, args);
    }
    clearTimeout(t);
    t = setTimeout(function () {
      t = null;
    }, wait);
  };
}

// Demo: first call prints quickly; later bursts are ignored until quiet
const firstTap = debounceLeading(function (x) {
  console.log("leading:", x);
}, 12);

for (let i = 0; i < 4; i++) {
  setTimeout(function () {
    firstTap("first-then-wait");
  }, i * 3);
}
Debounce e throttle — implementazione manuale — illustrazione 3

Throttle (leading)

Throttle limita le chiamate a una per intervallo di tempo, scartando quelle in eccesso.

// Throttle (leading): at most once per interval
function throttle(fn, wait) {
  let last = 0;
  return function (...args) {
    const now = Date.now();
    if (now - last >= wait) {
      last = now;
      fn.apply(null, args);
    }
  };
}

// Demo: many events, but prints at most once every 10ms
const throttled = throttle(function (n) {
  console.log("throttled:", n);
}, 10);

for (let i = 0; i < 10; i++) {
  setTimeout(function () {
    throttled(i);
  }, i * 2);
}
Debounce e throttle — implementazione manuale — illustrazione 4

Throttle (trailing)

Il throttle trailing garantisce che il valore più recente venga comunque ricevuto al termine dell'intervallo.

// Throttle (trailing): schedule the last call within the window
function throttleTrailing(fn, wait) {
  let last = 0;
  let timer = null;
  let queuedArgs = null;

  function invoke(args) {
    last = Date.now();
    fn.apply(null, args);
  }

  return function (...args) {
    const now = Date.now();
    const remaining = wait - (now - last);

    if (remaining <= 0) {
      // Window passed: run now
      clearTimeout(timer);
      timer = null;
      queuedArgs = null;
      invoke(args);
    } else {
      // Queue the latest args to run at the end of the window
      queuedArgs = args;
      clearTimeout(timer);
      timer = setTimeout(function () {
        timer = null;
        if (queuedArgs) {
          invoke(queuedArgs);
          queuedArgs = null;
        }
      }, remaining);
    }
  };
}

// Demo: last value in a burst is printed after the window
const trail = throttleTrailing(function (x) {
  console.log("trail:", x);
}, 10);

for (let i = 0; i < 6; i++) {
  setTimeout(function () {
    trail("v" + i);
  }, i * 3);
}
Debounce e throttle — implementazione manuale — illustrazione 5

Quale utilizzare e quando?

Scelta:

  • Debounce: ricerca durante la digitazione, ridimensionamento — esegua dopo che l'utente ha smesso.
  • Throttle: scorrimento/trascinamento — limiti le chiamate a un ritmo costante.
  • Utilizzi il leading per un feedback immediato e il trailing per acquisire il valore finale.
Debounce e throttle — implementazione manuale — illustrazione 6

Quiz su debounce e throttle

Verifica rapida: limitare le chiamate per intervallo.

Debounce e throttle — implementazione manuale — illustrazione 7

Riepilogo

Riepilogo: ha scritto un debounce trailing e uno leading, un semplice throttle leading e un throttle trailing leggero. Scelga il debounce per “dopo che l'utente ha smesso” e il throttle per “ritmo costante”.

Debounce e throttle — implementazione manuale — illustrazione 8

Domande Frequenti

La lezione «Debounce e throttle — implementazione manuale» è gratuita?

Sì — il testo completo di «Debounce e throttle — implementazione manuale» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso JavaScript Academy, passa a CoddyKit PRO. Il corso JavaScript Academy include 3 lezioni in totale.

Cosa imparerò in «Debounce e throttle — implementazione manuale»?

Costruisci piccole utility di debounce e throttle. Fai pratica con le varianti trailing e leading e impari quando scegliere ciascuna. Eserciti JavaScript Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare JavaScript Academy?

Non è richiesta alcuna esperienza precedente. JavaScript Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Debounce e throttle — implementazione manuale»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione JavaScript Academy?

Sì. Ogni lezione JavaScript Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. setTimeout, setInterval e deriva dei timer
  2. Debounce e throttle — implementazione manuale
  3. Temporizzazione delle animazioni — introduzione ai loop basati sul tempo
← Torna a JavaScript Academy