← JavaScript

Funciones

¿Qué es un callback y para qué sirve?

Ver respuesta — intenta responderla en voz alta primero

Un callback es una función que se pasa como argumento a otra función para que esta pueda ejecutarla más tarde. Se usa mucho en operaciones asíncronas y en métodos de arreglos como map o filter.

En JavaScript, las funciones son valores: puedes guardarlas en variables y pasarlas como argumentos. Cuando pasas una función a otra función para que la "llame de vuelta" en algún momento, esa función pasada es un callback.

Se usan en dos grandes contextos:

  • Síncrono: métodos como map, filter y forEach reciben un callback que se ejecuta por cada elemento.
  • Asíncrono: operaciones como setTimeout o las peticiones a un servidor reciben un callback que se ejecuta cuando la tarea termina.
// Callback síncrono: se ejecuta por cada elemento
const numeros = [1, 2, 3];
numeros.forEach(function (n) {
  console.log(n * 2); // 2, 4, 6
});

// Pasar una función definida como callback
function saludar(nombre) {
  console.log("Hola " + nombre);
}
function procesar(nombre, callback) {
  callback(nombre); // aquí "llama de vuelta"
}
procesar("Mike", saludar); // "Hola Mike"

// Callback asíncrono
setTimeout(function () {
  console.log("Esto se ejecuta después");
}, 1000);
  • Llamar al callback en lugar de pasarlo: escribir procesar(saludar()) en vez de procesar(saludar). Con paréntesis lo ejecutas de inmediato y pasas su resultado; sin paréntesis pasas la función en sí.
  • Callback hell: anidar muchos callbacks asíncronos crea código difícil de leer. Para eso existen las promesas y async/await.

"Un callback es una función que le paso a otra función como argumento para que la ejecute cuando lo necesite. Los uso todo el tiempo con métodos de arreglos como map o filter, donde el callback se ejecuta por cada elemento, y también en código asíncrono como setTimeout. Un detalle importante es pasar la función sin paréntesis, porque con paréntesis la ejecuto en lugar de pasarla."

Reto rápido

Escribe una función repetir(n, callback) que llame al callback n veces, pasándole el número de repetición actual (empezando en 1).

Ver solución
function repetir(n, callback) {
  for (let i = 1; i <= n; i++) {
    callback(i);
  }
}
repetir(3, (i) => console.log("Repetición " + i));
// Repetición 1
// Repetición 2
// Repetición 3