Volver a JavaScript Básico

Funciones

JavaScript ofrece múltiples formas de definir funciones, cada una con comportamiento ligeramente diferente.

Declaración de Función

function saludar(nombre) { return `¡Hola, ${nombre}!`; } // Hoisted — puede llamarse antes de la declaración console.log(saludar("Alice")); // ¡Hola, Alice!

Expresión de Función y Funciones Flecha

// Expresión de función const cuadrado = function(x) { return x * x; }; // Función flecha (moderna, preferida) const cubo = (x) => x * x * x; // Flecha multilínea const sumar = (a, b) => { const suma = a + b; return suma; };

Parámetros por Defecto

function crearUsuario(nombre, rol = "visitante", activo = true) { return { nombre, rol, activo }; } crearUsuario("Alice"); // { nombre: "Alice", rol: "visitante", activo: true } crearUsuario("Bob", "admin"); // { nombre: "Bob", rol: "admin", activo: true }

Parámetros Rest y Spread

function sumarTodo(...numeros) { return numeros.reduce((total, n) => total + n, 0); } sumarTodo(1, 2, 3, 4); // 10 // Spread — expandir array en argumentos const nums = [3, 1, 4, 1, 5]; console.log(Math.max(...nums)); // 5

Funciones de Orden Superior

// Funciones que reciben o retornan otras funciones function aplicarDoble(fn, valor) { return fn(fn(valor)); } const doble = x => x * 2; console.log(aplicarDoble(doble, 3)); // 12 // Map, filter, reduce const numeros = [1, 2, 3, 4, 5, 6]; const pares = numeros.filter(n => n % 2 === 0); // [2, 4, 6] const doblados = numeros.map(n => n * 2); // [2, 4, 6, 8, 10, 12] const total = numeros.reduce((acc, n) => acc + n, 0); // 21

Clausuras (Closures)

function crearContador(inicio = 0) { let cuenta = inicio; return { incrementar() { return ++cuenta; }, decrementar() { return --cuenta; }, valor() { return cuenta; }, }; } const contador = crearContador(10); contador.incrementar(); // 11 contador.incrementar(); // 12 contador.valor(); // 12

this en Funciones

const obj = { nombre: "Widget", // Función regular — `this` se refiere a obj getNombre() { return this.nombre; }, // Función flecha — `this` heredado del ámbito externo getNombreFlecha: () => { return this?.nombre; // `this` NO es obj aquí }, }; obj.getNombre(); // "Widget" obj.getNombreFlecha(); // undefined

Diferencia clave: Las funciones flecha NO tienen su propio this. Usa métodos regulares en objetos y clases.