funciones-super
1. Lo fundamental: funciones y paréntesis
function saludar() {
return "Hola mundo";
}
// CON paréntesis: EJECUTAS la función → obtienes el resultado
let resultado = saludar(); // resultado = "Hola mundo"
// SIN paréntesis: REFERENCIAS la función → obtienes la función misma
let referencia = saludar; // referencia = la función completaRegla de oro:
saludar()→ "ejecútame ahora"saludar→ "toma la función como valor"
2. ¿Qué es un callback?
Callback = una función que se pasa como argumento a otra función, para que esta otra la ejecute más tarde.
// Ejemplo simple de callback
function hacerAlgoLuego(callback) {
console.log("Haciendo algo...");
callback(); // Aquí ejecutamos la función que nos pasaron
}
// Usamos un callback
hacerAlgoLuego(function() {
console.log("Esto se ejecuta después");
});3. Eventos como onclick esperan un callback
Cuando escribes boton.onclick = ???, JavaScript espera una función (callback) que ejecutará cuando ocurra el clic.
❌ ERROR COMÚN (con paréntesis):
boton.onclick = cambiar(); // ¡MAL!Esto significa: ejecuta cambiar() AHORA MISMO y el resultado (que es undefined porque no retorna nada) se asigna a onclick. El clic no hará nada.
✅ CORRECTO (sin paréntesis):
boton.onclick = cambiar; // ¡BIEN!Esto significa: toma la función cambiar y guárdala para ejecutarla cuando haya clic.
4. ¿Por qué en el HTML onclick="myFunction()" SÍ lleva paréntesis?
<button onclick="myFunction()">Click</button>¡Aquí es diferente! El HTML onclick recibe un string de código JavaScript que se evalúa. Cuando haces clic, JavaScript evalúa ese string y encuentra myFunction(), por eso sí lleva paréntesis.
Es equivalente a hacer:
eval("myFunction()"); // Esto ejecuta la función5. Comparativa visual
| Contexto | Cómo se escribe | Por qué |
|---|---|---|
boton.onclick = miFuncion | Sin () | Le ESTÁS PASANDO la función para que la ejecute DESPUÉS |
boton.onclick = miFuncion() | Con () | Ejecuta AHORA y pasa el RESULTADO (normalmente nada útil) |
onclick="miFuncion()" en HTML | Con () | El contenido es un string que se EVALÚA al hacer clic |
let x = miFuncion | Sin () | Quieres la FUNCIÓN como valor |
let x = miFuncion() | Con () | Quieres el RESULTADO de ejecutarla ahora |
6. Funciones anónimas (sin nombre) y flecha
// Función anónima (sin nombre)
boton.onclick = function() {
parrafo.style.color = "olive";
};
// Función flecha (es lo mismo, sintaxis más moderna)
boton.onclick = () => {
parrafo.style.color = "olive";
};No es porque sean anónimas, es porque estás pasando la función sin ejecutarla (no hay () después).
7. Resumen visual final
// PASAR función (para ejecutar DESPUÉS)
boton.onclick = cambiar; // ✅ Sin ()
boton.onclick = function() {}; // ✅ Sin ()
boton.onclick = () => {}; // ✅ Sin ()
// EJECUTAR función (AHORA mismo)
boton.onclick = cambiar(); // ❌ Con () - ejecuta ahora
boton.onclick = cambiar() + 1; // ❌ Con () - ejecuta ahoraRegla definitiva
Cuando quieras que una función se ejecute MÁS TARDE (en un clic, timeout, etc.), pásala SIN paréntesis.
Cuando quieras ejecutarla AHORA MISMO, usa paréntesis.
// Ejecutar después
setTimeout(miFuncion, 1000); // Sin ()
boton.onclick = miFuncion; // Sin ()
// Ejecutar ahora
setTimeout(miFuncion(), 1000); // Con () - ¡error lógico!
boton.onclick = miFuncion(); // Con () - ejecuta ahora¿Te quedó más claro?
Lo que tienes CORRECTO:
1. Son equivalentes:
boton.onclick = cambiar;boton.onclick = function() {
parrafo.style.color = "olive";
};Sí, exactamente. En ambos casos estás pasando la función (sin ejecutarla).
2. No puedes poner () porque JavaScript ejecutaría inmediatamente:
boton.onclick = cambiar(); // ❌ Se ejecuta AHORA, no cuando hagan clic3. HTML onclick="myFunction()" funciona porque está dentro de un string:
<button onclick="myFunction()">Click</button>Tu entendimiento es correcto: El navegador NO evalúa myFunction() hasta que haces clic. El contenido es solo texto dentro del HTML.
🔄 Cómo funciona internamente:
// El navegador LEE el HTML y crea algo como esto internamente:
button.onclick = function(event) {
eval("myFunction()"); // Esto se ejecuta SOLO cuando hay clic
};❓ Tu duda sobre funciones que reciben funciones como parámetros
Preguntaste: "¿Se puede pasar una función CON paréntesis a otra función?"
Respuesta corta: Sí, pero se ejecuta inmediatamente
// EJEMPLO 1: Recibir función como callback
function hacerAlgo(callback) {
console.log("Preparando...");
callback(); // Aquí se ejecuta después
}
// ✅ Bien - PASAS la función (sin ejecutar)
hacerAlgo(saludar); // Pasa la función
hacerAlgo(() => console.log("Hola")); // Pasa función flecha
// ❌ Mal (generalmente) - EJECUTAS antes de pasar
hacerAlgo(saludar()); // saludar() se ejecuta AHORA, luego se pasa su RESULTADOPero hay casos donde SÍ usas () dentro del parámetro:
// Caso especial: funciones que RETORNAN funciones
function crearSaludo(nombre) {
return function() {
console.log("Hola " + nombre);
};
}
// Aquí SÍ usamos paréntesis porque queremos crear la función ahora
let saludoAna = crearSaludo("Ana"); // ← crearSaludo() se ejecuta AHORA
// pero nos devuelve UNA NUEVA FUNCIÓN
boton.onclick = saludoAna; // ← la función resultante se pasa SIN ()📊 Comparativa definitiva:
| Código | ¿Cuándo se ejecuta? | Qué se asigna/retorna |
|---|---|---|
boton.onclick = miFuncion | Cuando hay clic | La función misma |
boton.onclick = miFuncion() | Inmediatamente | El RESULTADO de miFuncion() |
onclick="miFuncion()" (HTML) | Cuando hay clic | Se evalúa el string |
setTimeout(miFuncion, 1000) | Después de 1 segundo | La función misma |
setTimeout(miFuncion(), 1000) | Inmediatamente | El RESULTADO (error lógico) |
otraFuncion(miFuncion) | Dentro de otraFuncion | La función misma |
otraFuncion(miFuncion()) | Inmediatamente | El RESULTADO |
🎯 El concepto clave que te falta:
La diferencia entre PASAR y EJECUTAR:
// PASAR la función (sin paréntesis)
function ejecutarDespues(fn) {
setTimeout(fn, 1000); // fn se guarda para después
}
// EJECUTAR ahora (con paréntesis)
function ejecutarAhora(fn) {
let resultado = fn(); // ← EJECUTA ahora y guarda el resultado
return resultado;
}💡 Analogía final:
Imagina que la función es una receta de cocina:
miFuncion(sin()) = la receta misma (puedes guardarla, regalarla, usarla después)miFuncion()(con()) = cocinar la receta (obtienes el plato ahora mismo)
// onclick espera una RECETA para cocinarla después
boton.onclick = receta; // ✅ Guardo la receta
boton.onclick = receta(); // ❌ Cocino ahora, le paso el plato vacío
// HTML onclick es una nota que dice "cocina receta() cuando te diga"
<button onclick="receta()"> // ✅ La nota se evalúa después🎓 Resumen final:
Sin
()= pasas la función (para ejecutar después)Con
()= ejecutas la función (ahora mismo)HTML onclick es especial porque es texto que se evalúa después
Callback = función que pasas para que otra la ejecute después
Una función que retorna otra función es la única vez que usas
()para crear la función, pero aún así la usas sin()al pasarla
Aquí tienes los 4 ejemplos convertidos de las imágenes, con explicación de cada uno:
🔵 Ejemplo 1: Evento en HTML (más antiguo)
<!DOCTYPE html>
<html>
<body>
<div class="container">
<h1 id="titulo">Hola soy un documento en HTML</h1>
<p id="parrafo">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt, corporis.</p>
<button id="boton" class="btn btn-info" onclick="alert('click')">Cambiar</button>
</div>
<script>
var parrafo = document.getElementById("parrafo");
parrafo.style.color = "olive";
</script>
</body>
</html>📝 Explicación:
El evento
onclickestá dentro del HTML (en la etiqueta<button>)onclick="alert('click')"es un string que se evalúa cuando haces clicEl script aparte cambia el color del párrafo inmediatamente al cargar la página
⚠️ Desventaja: Mezcla HTML con JavaScript (difícil de mantener)
🟢 Ejemplo 2: Función anónima
<!DOCTYPE html>
<html>
<body>
<div class="container">
<h1 id="titulo">Hola soy un documento en HTML</h1>
<p id="parrafo">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt, corporis.</p>
<button id="boton" class="btn btn-info">Cambiar</button>
</div>
<script>
var parrafo = document.getElementById("parrafo");
var boton = document.getElementById("boton");
// 🔥 FUNCIÓN ANÓNIMA - no tiene nombre
boton.onclick = function () {
parrafo.style.color = "olive";
}
</script>
</body>
</html>📝 Explicación:
Función anónima = función sin nombre
Se asigna directamente a
boton.onclick✅ Ventaja: Todo está en JavaScript, no mezclas con HTML
La función se pasa sin paréntesis (solo la definición)
Se ejecutará cuando hagan clic
🟡 Ejemplo 3: Función con nombre (callback)
<!DOCTYPE html>
<html>
<body>
<div class="container">
<h1 id="titulo">Hola soy un documento en HTML</h1>
<p id="parrafo">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt, corporis.</p>
<button id="boton" class="btn btn-info">Cambiar</button>
</div>
<script>
var parrafo = document.getElementById("parrafo");
var boton = document.getElementById("boton");
// Función con nombre
function cambiar() {
parrafo.style.color = "olive";
}
// ✅ PASAMOS la función SIN ejecutar
boton.onclick = cambiar; // ← Sin paréntesis
</script>
</body>
</html>📝 Explicación:
cambiares una función con nombreboton.onclick = cambiar→ sin paréntesis = pasamos la funciónLa función NO se ejecuta ahora, se guarda para después
✅ Esta es la forma más limpia y reutilizable
🔴 Ejemplo 4: ❌ ERROR COMÚN
<!DOCTYPE html>
<html>
<body>
<div class="container">
<h1 id="titulo">Hola soy un documento en HTML</h1>
<p id="parrafo">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Deserunt, corporis.</p>
<button id="boton" class="btn btn-info">Cambiar</button>
</div>
<script>
var parrafo = document.getElementById("parrafo");
var boton = document.getElementById("boton");
function cambiar() {
parrafo.style.color = "olive";
}
// ❌ ERROR: ejecuta cambiar() AHORA MISMO
boton.onclick = cambiar(); // ← Con paréntesis
</script>
</body>
</html>📝 Explicación del ERROR:
cambiar()con paréntesis = ejecuta la función inmediatamenteEl color cambia al cargar la página, sin necesidad de hacer clic
boton.onclickrecibe el resultado de la función (que esundefined)❌ El botón NO hará nada cuando hagas clic
📊 Comparativa final
| Ejemplo | Código | ¿Funciona? | ¿Cuándo cambia el color? |
|---|---|---|---|
| 1 | onclick="alert('click')" | ✅ Sí | Al hacer clic |
| 2 | onclick = function() {...} | ✅ Sí | Al hacer clic |
| 3 | onclick = cambiar | ✅ Sí | Al hacer clic |
| 4 | onclick = cambiar() | ❌ No | Inmediatamente (error) |
📚 ¿Qué son las funciones anónimas?
// Función NORMAL con nombre
function saludar() {
console.log("Hola");
}
// Función ANÓNIMA (sin nombre)
function() {
console.log("Hola");
}
// Las anónimas se usan comúnmente así:
boton.onclick = function() {
console.log("Hola");
};
// O como callback
setTimeout(function() {
console.log("Pasó 1 segundo");
}, 1000);Características:
No tienen nombre reutilizable
Se usan una sola vez (generalmente)
Son perfectas para eventos cortos
También existen como arrow functions:
() => {...}
// Función anónima tradicional
boton.onclick = function() {
parrafo.style.color = "olive";
};
// Arrow function (misma idea, sintaxis moderna)
boton.onclick = () => {
parrafo.style.color = "olive";
};🎯 Regla de oro (repaso)
| Si escribes... | Significa... |
|---|---|
cambiar | La función misma (para ejecutar DESPUÉS) |
cambiar() | El resultado de la función (ejecutar AHORA) |
function() {...} | Función anónima (sin nombre) |
() => {...} | Función flecha anónima |
¿Ahora te queda más clara la diferencia entre los 4 ejemplos?
1. Funciones anónimas
Son funciones sin nombre. Se definen en el lugar donde se van a usar, normalmente como argumento de otra función o asignadas a una variable.
Ejemplo clásico (sin asignar a variable):
setTimeout(function() {
console.log("Pasó 1 segundo");
}, 1000);Ejemplo asignado a variable:
const saludar = function(nombre) {
return "Hola " + nombre;
};
console.log(saludar("Ana")); // "Hola Ana"2. Funciones tipo flecha (arrow functions)
Es una forma más corta de escribir funciones anónimas. Se escriben con =>. Tienen algunas diferencias importantes (como el comportamiento de this), pero para empezar, piensa en ellas como una sintaxis más limpia.
Sintaxis básica:
// Función normal
const sumar = function(a, b) {
return a + b;
};
// Arrow function equivalente
const sumarFlecha = (a, b) => a + b;
console.log(sumarFlecha(3, 5)); // 8Casos especiales:
Un solo parámetro: puedes omitir paréntesis
Una sola expresión: puedes omitir
{}yreturn
const doble = n => n * 2;
console.log(doble(4)); // 8
// Si necesitas varias líneas, usas {} y return explícito
const mayor = (a, b) => {
if (a > b) return a;
return b;
};3. Funciones callback
Una callback es una función que se pasa como argumento a otra función, y esta la ejecutará más tarde (cuando termine algo, o cuando ocurra un evento).
Ejemplo simple:
function procesarUsuario(nombre, callback) {
console.log("Procesando a " + nombre);
callback(nombre);
}
procesarUsuario("Luis", function(n) {
console.log("Terminé con " + n);
});
// Salida:
// Procesando a Luis
// Terminé con LuisCallback con funciones anónimas y flecha:
// Con función anónima tradicional
[1, 2, 3].forEach(function(num) {
console.log(num * 2);
});
// Con arrow function (más moderna y común)
[1, 2, 3].forEach(num => console.log(num * 2));
// 2, 4, 6Ejemplo útil (simulando operación asíncrona):
function hacerTarea(tarea, callback) {
console.log("Haciendo " + tarea + "...");
setTimeout(() => {
callback(tarea + " completada");
}, 1000);
}
hacerTarea("limpiar", mensaje => {
console.log(mensaje);
});
// Después de 1 segundo: "limpiar completada"Resumen rápido
| Concepto | ¿Qué es? | Ejemplo mínimo |
|---|---|---|
| Función anónima | Función sin nombre | function(x){ return x*2; } |
| Arrow function | Sintaxis corta de función anónima | x => x*2 |
| Callback | Función pasada a otra función | algo( (resultado) => {...} ) |
Y lo mejor: puedes combinarlos. Las arrow functions se usan mucho como callbacks porque son más limpias:
// Callback con arrow function
boton.addEventListener("click", () => {
console.log("Click!");
});¿Necesitas ahondar en algún punto en particular?
Comentarios
Publicar un comentario