Funciones y Arrow Functions
Aprende a crear y usar funciones en JavaScript, comparando con Java y descubriendo las diferencias clave del lenguaje.
1. Funciones Tradicionales
Las funciones son bloques de código reutilizables que realizan una tarea específica. Si vienes de Java, notarás algunas diferencias importantes:
- No necesitas declarar tipos - JavaScript no requiere especificar el tipo de retorno ni los tipos de parámetros
- No existe
void- Las funciones que no retornan nada simplemente no usanreturn - Parámetros flexibles - Puedes llamar una función con más o menos parámetros de los declarados
Comparación con Java
Java
1// Función con tipo de retorno2public int sumar(int a, int b) {3 return a + b;4}5 6// Función void (sin retorno)7public void saludar(String nombre) {8 System.out.println("Hola " + nombre);9}10 11// Tipos obligatorios12public String obtenerNombre() {13 return "Juan";14}JavaScript
1// Función con retorno (sin tipo)2function sumar(a, b) {3 return a + b;4}5 6// Función sin retorno (no se usa void)7function saludar(nombre) {8 console.log("Hola " + nombre);9}10 11// Sin tipos12function obtenerNombre() {13 return "Juan";14}Declaración de funciones
1// Sintaxis básica2function nombreFuncion(parametro1, parametro2) {3 // Código a ejecutar4 return resultado;5}6 7// Ejemplo: función que suma dos números8function sumar(a, b) {9 return a + b;10}11 12console.log(sumar(5, 3)); // 813 14// Función sin parámetros15function saludar() {16 return "¡Hola!";17}18 19console.log(saludar()); // "¡Hola!"20 21// Función sin return (devuelve undefined)22function imprimirMensaje(mensaje) {23 console.log(mensaje);24 // No hay return, devuelve undefined automáticamente25}26 27const resultado = imprimirMensaje("Hola");28console.log(resultado); // undefinedParámetros por defecto
1// En JavaScript puedes asignar valores por defecto2function saludar(nombre = "Invitado") {3 return `Hola, ${nombre}`;4}5 6console.log(saludar("Ana")); // "Hola, Ana"7console.log(saludar()); // "Hola, Invitado"8 9// Múltiples parámetros por defecto10function crearUsuario(nombre = "Anónimo", edad = 18, activo = true) {11 return {12 nombre: nombre,13 edad: edad,14 activo: activo15 };16}17 18console.log(crearUsuario()); // { nombre: "Anónimo", edad: 18, activo: true }19console.log(crearUsuario("Carlos", 25)); // { nombre: "Carlos", edad: 25, activo: true }20console.log(crearUsuario("María", 30, false)); // { nombre: "María", edad: 30, activo: false }Return en JavaScript
1// Return detiene la ejecución de la función2function esMayorDeEdad(edad) {3 if (edad >= 18) {4 return true; // Sale aquí si es mayor de edad5 }6 return false; // Solo llega aquí si no es mayor de edad7}8 9// Return puede devolver cualquier tipo de dato10function obtenerDatos() {11 return {12 nombre: "Juan",13 edad: 25,14 hobbies: ["lectura", "programación"]15 };16}17 18// Función sin return devuelve undefined19function sinRetorno() {20 const x = 5 + 3;21 // No hay return22}23 24console.log(sinRetorno()); // undefined25 26// Return temprano para validaciones27function dividir(a, b) {28 if (b === 0) {29 return "Error: no se puede dividir entre 0";30 }31 return a / b;32}33 34console.log(dividir(10, 2)); // 535console.log(dividir(10, 0)); // "Error: no se puede dividir entre 0"💡 Diferencia clave con Java
En Java necesitas declarar void cuando la función no retorna nada. En JavaScript, simplemente no usas return (o la función retorna undefined).
2. Expresiones de Función
En JavaScript, las funciones son valores que puedes asignar a variables. Esto es diferente de Java donde los métodos siempre pertenecen a una clase.
1// Expresión de función2const sumar = function(a, b) {3 return a + b;4};5 6console.log(sumar(5, 3)); // 87 8// La variable contiene la función9const operacion = sumar;10console.log(operacion(10, 5)); // 1511 12// Funciones como argumentos13function ejecutarOperacion(func, a, b) {14 return func(a, b);15}16 17const multiplicar = function(x, y) {18 return x * y;19};20 21console.log(ejecutarOperacion(sumar, 5, 3)); // 822console.log(ejecutarOperacion(multiplicar, 5, 3)); // 15⚠️ Diferencia con declaraciones
Las declaraciones de función (function nombre() ) son "elevadas" (hoisting) y pueden usarse antes de ser declaradas.
Las expresiones de función (const nombre = function() ) NO son elevadas y deben declararse antes de usarse.
3. Arrow Functions (Funciones Flecha)
Las arrow functions son una sintaxis más corta y moderna para escribir funciones. Son especialmente útiles para funciones cortas y callbacks.
Para este curso: Es bueno que sepas que existen y entiendas su sintaxis, pero nos centraremos en funciones tradicionales. Las arrow functions son más comunes en código moderno, pero las funciones tradicionales son más fáciles de entender al principio.
Sintaxis básica
1// Función tradicional2function sumar(a, b) {3 return a + b;4}5 6// Arrow function equivalente7const sumar = (a, b) => {8 return a + b;9};10 11// Arrow function con return implícito (sin llaves)12const sumar = (a, b) => a + b;13 14console.log(sumar(5, 3)); // 8Diferentes formas de escribir arrow functions
1// Sin parámetros - necesitas paréntesis vacíos2const saludar = () => "¡Hola!";3console.log(saludar()); // "¡Hola!"4 5// Un solo parámetro - paréntesis opcionales6const doble = x => x * 2;7const dobleConParentesis = (x) => x * 2;8console.log(doble(5)); // 109 10// Múltiples parámetros - paréntesis obligatorios11const sumar = (a, b) => a + b;12console.log(sumar(3, 4)); // 713 14// Cuerpo con múltiples líneas - necesitas llaves y return15const calcular = (a, b) => {16 const suma = a + b;17 const mensaje = `Resultado: ${suma}`;18 return mensaje;19};20console.log(calcular(5, 3)); // "Resultado: 8"21 22// Retornar un objeto - necesitas paréntesis23const crearPersona = (nombre, edad) => ({24 nombre: nombre,25 edad: edad26});27console.log(crearPersona("Ana", 25)); // { nombre: "Ana", edad: 25 }Uso común: Callbacks en arrays
1const numeros = [1, 2, 3, 4, 5];2 3// Con función tradicional4const dobles1 = numeros.map(function(num) {5 return num * 2;6});7 8// Con arrow function (más concisa)9const dobles2 = numeros.map(num => num * 2);10 11console.log(dobles2); // [2, 4, 6, 8, 10]12 13// Filtrar con arrow function14const pares = numeros.filter(num => num % 2 === 0);15console.log(pares); // [2, 4]16 17// Reduce con arrow function18const suma = numeros.reduce((acc, num) => acc + num, 0);19console.log(suma); // 15💡 ¿Cuándo usar arrow functions?
- ✅ Usa arrow functions: Para callbacks cortos (map, filter, forEach, etc.)
- ✅ Usa funciones tradicionales: Para funciones principales de tu programa, métodos de objetos, o cuando necesites más claridad
- 📚 Para aprender: Empieza con funciones tradicionales, son más explícitas y fáciles de entender
4. Ámbito (Scope) de Variables
El ámbito determina dónde puedes acceder a una variable. JavaScript tiene ámbito de función y ámbito de bloque.
1// Variables globales - accesibles en todo el código2const global = "Soy global";3 4function mostrarScope() {5 // Variable local - solo existe dentro de la función6 const local = "Soy local";7 console.log(global); // ✅ Puede acceder a global8 console.log(local); // ✅ Puede acceder a local9}10 11mostrarScope();12console.log(global); // ✅ Puede acceder a global13// console.log(local); // ❌ Error: local no está definido14 15// Ámbito de bloque con let y const16function ejemploBloque() {17 if (true) {18 const dentroDelIf = "Solo en el if";19 let tambiénLocal = "También solo en el if";20 console.log(dentroDelIf); // ✅ Funciona aquí21 }22 // console.log(dentroDelIf); // ❌ Error: no existe fuera del if23}24 25// Parámetros de función tienen ámbito local26function sumar(a, b) {27 return a + b;28}29// console.log(a); // ❌ Error: a no existe fuera de la función5. Ejercicios Prácticos
Ejercicio 1: Calculadora de IMC
Crea una función que calcule el Índice de Masa Corporal (IMC). La fórmula es: IMC = peso / (altura²)
1// Tu código aquí2 3 4 5const peso = 70; // kg6const altura = 1.75; // metros7 8console.log(calcularIMC(peso, altura)); // 22.86 Ver solución
1function calcularIMC(peso, altura) {2 return peso / (altura * altura);3}4 5const peso = 70;6const altura = 1.75;7 8console.log(calcularIMC(peso, altura)); // 22.8571428571428589 10// Opcional: redondear a 2 decimales11function calcularIMCRedondeado(peso, altura) {12 const imc = peso / (altura * altura);13 return Math.round(imc * 100) / 100;14}15 16console.log(calcularIMCRedondeado(peso, altura)); // 22.86Ejercicio 2: Función con parámetros por defecto
Crea una función crearSaludo que reciba un nombre y una hora del día (por defecto "día"), y retorne un saludo apropiado.
1// Tu código aquí2 3 4 5console.log(crearSaludo("Ana")); // "Buenos días, Ana"6console.log(crearSaludo("Carlos", "tarde")); // "Buenas tardes, Carlos"7console.log(crearSaludo("María", "noche")); // "Buenas noches, María" Ver solución
1function crearSaludo(nombre, momento = "día") {2 return `Buenos ${momento}s, ${nombre}`;3}4 5console.log(crearSaludo("Ana")); // "Buenos días, Ana"6console.log(crearSaludo("Carlos", "tarde")); // "Buenas tardes, Carlos"7console.log(crearSaludo("María", "noche")); // "Buenas noches, María"8 9// Versión alternativa con if10function crearSaludoAlternativo(nombre, momento = "día") {11 let saludo;12 if (momento === "día") {13 saludo = "Buenos días";14 } else if (momento === "tarde") {15 saludo = "Buenas tardes";16 } else {17 saludo = "Buenas noches";18 }19 return `${saludo}, ${nombre}`;20}Ejercicio 3: Validación de contraseña
Crea una función que valide si una contraseña es segura. Una contraseña es segura si tiene al menos 8 caracteres. La función debe retornar true o false.
1// Tu código aquí2 3 4 5console.log(esPasswordSegura("abc123")); // false6console.log(esPasswordSegura("password123")); // true7console.log(esPasswordSegura("MiClave2024")); // true Ver solución
1function esPasswordSegura(password) {2 return password.length >= 8;3}4 5console.log(esPasswordSegura("abc123")); // false6console.log(esPasswordSegura("password123")); // true7console.log(esPasswordSegura("MiClave2024")); // true8 9// Versión con if explícito10function esPasswordSeguraExplicita(password) {11 if (password.length >= 8) {12 return true;13 } else {14 return false;15 }16}17 18// Versión con validación más completa19function esPasswordMuySegura(password) {20 if (password.length < 8) {21 return false;22 }23 // Verificar que tenga al menos un número24 const tieneNumero = /[0-9]/.test(password);25 return tieneNumero;26}Ejercicio 4: Contador de vocales
Crea una función que cuente cuántas vocales (a, e, i, o, u) hay en un string. Usa un bucle para recorrer el string.
1// Tu código aquí2 3 4 5console.log(contarVocales("Hola Mundo")); // 46console.log(contarVocales("JavaScript")); // 37console.log(contarVocales("Programación")); // 5 Ver solución
1function contarVocales(texto) {2 const vocales = "aeiouAEIOUáéíóúÁÉÍÓÚ";3 let contador = 0;4 5 for (let i = 0; i < texto.length; i++) {6 if (vocales.includes(texto[i])) {7 contador++;8 }9 }10 11 return contador;12}13 14console.log(contarVocales("Hola Mundo")); // 415console.log(contarVocales("JavaScript")); // 316console.log(contarVocales("Programación")); // 517 18// Versión con for...of (más moderna)19function contarVocalesModerno(texto) {20 const vocales = "aeiouAEIOUáéíóúÁÉÍÓÚ";21 let contador = 0;22 23 for (const letra of texto) {24 if (vocales.includes(letra)) {25 contador++;26 }27 }28 29 return contador;30}