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.