n-funcion - el botón-n
En el botón: ¿QUIÉN ejecuta la función?
javascript
// TÚ escribes esto:
const saludar = () => {
console.log("🔥 EJECUTANDO");
};
// Le DICES al botón: "aquí tienes la función, tú ejecútala cuando hagan click"
boton.addEventListener("click", saludar);
// ↑
// Sin () - solo pasas la función
// ¿QUIÉN ejecuta saludar() después?
// ¡EL NAVEGADOR! Cuando el usuario hace click
El navegador ejecuta por ti (como Express)
javascript
// Simulación de cómo funciona addEventListener internamente
class Boton {
constructor() {
this.eventos = {}; // Donde guarda las funciones
}
// Este es addEventListener
click(funcionAGuardar) {
console.log("📦 Guardando función para cuando hagan click");
this.eventos.click = funcionAGuardar; // Guarda sin ejecutar
}
// Simular que el usuario hace click
usuarioHaceClick() {
console.log("🖱️ Usuario hizo click");
const funcionGuardada = this.eventos.click;
if (funcionGuardada) {
console.log("✅ El navegador EJECUTA la función guardada");
funcionGuardada(); // ← ¡Aquí es donde se ejecuta después!
}
}
}
// ===== USO =====
const miBoton = new Boton();
const saludar = () => console.log("🔥 HOLA");
// TÚ guardas la función (sin ejecutar)
miBoton.click(saludar);
// DESPUÉS (cuando el usuario hace click)
console.log("\n--- Tiempo después ---");
miBoton.usuarioHaceClick(); // El navegador ejecuta
Concepto Fundamental
La clave está en que guardas la función para ejecutarla después, no en el momento de registrarla.
📝 Desglose del Código
1. Clase Boton (simula un elemento del DOM)
class Boton {
constructor() {
this.eventos = {}; // Objeto que actuará como "registro de eventos"
}
}
this.eventos es como una "agenda" donde se apuntan las funciones
Cada tipo de evento (click, mouseover, etc.) tendrá su propia función guardada
class Boton { constructor() { this.eventos = {}; // Objeto que actuará como "registro de eventos" } }
this.eventos es como una "agenda" donde se apuntan las funciones
Cada tipo de evento (click, mouseover, etc.) tendrá su propia función guardada
2. Método click (simula addEventListener)
click(funcionAGuardar) {
console.log("📦 Guardando función...");
this.eventos.click = funcionAGuardar; // Solo GUARDA, NO ejecuta
}
Recibe una función como parámetro
La almacena en this.eventos.click sin ejecutarla
Esto es CRÍTICO: ¡la función solo se guarda, no se llama!
click(funcionAGuardar) { console.log("📦 Guardando función..."); this.eventos.click = funcionAGuardar; // Solo GUARDA, NO ejecuta }
Recibe una función como parámetro
La almacena en this.eventos.click sin ejecutarla
Esto es CRÍTICO: ¡la función solo se guarda, no se llama!
3. Método usuarioHaceClick (simula el evento real)
usuarioHaceClick() {
console.log("🖱️ Usuario hizo click");
const funcionGuardada = this.eventos.click;
if (funcionGuardada) {
console.log("✅ El navegador EJECUTA la función");
funcionGuardada(); // ← AQUÍ es donde se ejecuta
}
}
Simula que el usuario físicamente hace click
Busca si hay una función guardada para el evento 'click'
Ahora sí, ejecuta la función con funcionGuardada()
usuarioHaceClick() { console.log("🖱️ Usuario hizo click"); const funcionGuardada = this.eventos.click; if (funcionGuardada) { console.log("✅ El navegador EJECUTA la función"); funcionGuardada(); // ← AQUÍ es donde se ejecuta } }
Simula que el usuario físicamente hace click
Busca si hay una función guardada para el evento 'click'
Ahora sí, ejecuta la función con funcionGuardada()
🎬 Flujo de Ejecución Visual
1. TÚ (programador):
miBoton.click(saludar)
↓
📦 Se GUARDA la función "saludar" en el registro
(NO se ejecuta todavía)
--- Pasa el tiempo ---
2. USUARIO (hace click):
miBoton.usuarioHaceClick()
↓
🖱️ El navegador detecta el click
↓
🔍 Busca en el registro: ¿hay función para 'click'?
↓
✅ ¡Sí! Ejecuta funcionGuardada()
↓
🔥 "HOLA" aparece en consola
1. TÚ (programador): miBoton.click(saludar) ↓ 📦 Se GUARDA la función "saludar" en el registro (NO se ejecuta todavía) --- Pasa el tiempo --- 2. USUARIO (hace click): miBoton.usuarioHaceClick() ↓ 🖱️ El navegador detecta el click ↓ 🔍 Busca en el registro: ¿hay función para 'click'? ↓ ✅ ¡Sí! Ejecuta funcionGuardada() ↓ 🔥 "HOLA" aparece en consola
💡 Por qué es importante
En el JavaScript real:
// TÚ haces esto:
document.getElementById("miBoton").addEventListener("click", () => {
console.log("¡Click!"); // Esta función NO se ejecuta ahora
});
// El navegador la ejecutará SOLO cuando el usuario haga click
// TÚ haces esto: document.getElementById("miBoton").addEventListener("click", () => { console.log("¡Click!"); // Esta función NO se ejecuta ahora }); // El navegador la ejecutará SOLO cuando el usuario haga click
🎯 Diferencia Clave con una Ejecución Normal
// ❌ MAL (se ejecutaría inmediatamente)
miBoton.click(saludar()); // ¡Los paréntesis ejecutan AHORA!
// ✅ BIEN (solo se guarda)
miBoton.click(saludar); // Sin paréntesis = solo referencia
// ❌ MAL (se ejecutaría inmediatamente) miBoton.click(saludar()); // ¡Los paréntesis ejecutan AHORA! // ✅ BIEN (solo se guarda) miBoton.click(saludar); // Sin paréntesis = solo referencia
🌟 Comportamiento Visual
Si ejecutas el código, verás:
📦 Guardando función para cuando hagan click
--- Tiempo después ---
🖱️ Usuario hizo click
✅ El navegador EJECUTA la función guardada
🔥 HOLA
El "comportamiento visual" que mencionas es precisamente esto: ves que la función se guarda primero, y solo cuando simulas el click es cuando realmente se ejecuta y ves el "🔥 HOLA".
¿Necesitas que profundice en algún aspecto específico?
📦 Guardando función para cuando hagan click --- Tiempo después --- 🖱️ Usuario hizo click ✅ El navegador EJECUTA la función guardada 🔥 HOLA
Comparación completa: Botón vs Express vs setTimeout
javascript
// === MISMA REGLA EN TODOS ===
// 1. BOTÓN (navegador ejecuta)
boton.addEventListener("click", saludar); // Guardas
// El navegador ejecuta cuando el usuario hace click
// 2. EXPRESS (servidor ejecuta)
app.get('/', controller.mostrarIndex); // Guardas
// Express ejecuta cuando el usuario visita la URL
// 3. setTimeout (JavaScript ejecuta)
setTimeout(saludar, 1000); // Guardas (sin () )
// JavaScript ejecuta después de 1 segundo
// 4. setInterval (JavaScript ejecuta)
setInterval(saludar, 2000); // Guardas
// JavaScript ejecuta cada 2 segundos
¿Por qué NO puedes poner saludar() en el botón?
javascript
// ❌ INCORRECTO
boton.addEventListener("click", saludar());
// ↑
// Ejecuta AHORA mismo
// ¿Qué pasa?
saludar(); // Se ejecuta inmediatamente al cargar la página
// El resultado (undefined) es lo que se guarda
boton.addEventListener("click", undefined); // El botón no hace nada después
// ✅ CORRECTO
boton.addEventListener("click", saludar);
// Guarda la función, el navegador la ejecutará después
Ejecutando DESPUÉS en cada caso:
javascript
const miFuncion = () => {
console.log("🔥 EJECUTANDO");
};
// Caso 1: setTimeout (ejecuta DESPUÉS de 1 segundo)
setTimeout(miFuncion, 1000); // Guarda, ejecuta después
// Caso 2: Botón (ejecuta DESPUÉS del click)
boton.onclick = miFuncion; // Guarda, ejecuta después
// Caso 3: Express (ejecuta DESPUÉS de la visita)
app.get('/', miFuncion); // Guarda, ejecuta después
// Caso 4: Tú manualmente (ejecuta AHORA)
miFuncion(); // Ejecuta inmediatamente
El patrón común (Callback)
javascript
// TÚ: Creas la función
const saludar = () => {
console.log("Hola");
};
// TÚ: La PASAS (sin ejecutar) a otro código
addEventListener("click", saludar); // ← Pasas la función
setTimeout(saludar, 1000); // ← Pasas la función
app.get('/', saludar); // ← Pasas la función
// ELLOS (navegador, setTimeout, Express): La EJECUTAN después
// cuando ocurre el evento que corresponda
Visual final:
text
TÚ ESCRIBES:
boton.addEventListener("click", saludar)
↑
Pasas la función 📦
NAVEGADOR GUARDA:
"Tengo una función guardada para cuando hagan click"
[PASA EL TIEMPO...]
USUARIO HACE CLICK:
NAVEGADOR: "¡Alguien hizo click!"
NAVEGADOR: "Ejecuto la función guardada"
NAVEGADOR: saludar() ← ¡AHORA SÍ con ()!
RESULTADO:
🔥 EJECUTANDO
En resumen: No ejecutas la función tú. El navegador (o Express, o setTimeout) la ejecuta por ti cuando ocurre el evento. Tú solo les das la función guardada para que ellos la ejecuten después.
Comentarios
Publicar un comentario