Volver al inicio
Fundamentos de JavaScript

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 usan return
  • Parámetros flexibles - Puedes llamar una función con más o menos parámetros de los declarados

Comparación con Java

Java

Java - Tipos obligatoriosjava
1// Función con tipo de retorno
2public 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 obligatorios
12public String obtenerNombre() {
13 return "Juan";
14}

JavaScript

JavaScript - Sin tiposjavascript
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 tipos
12function obtenerNombre() {
13 return "Juan";
14}

Declaración de funciones

Declaración de funcionesjavascript
1// Sintaxis básica
2function nombreFuncion(parametro1, parametro2) {
3 // Código a ejecutar
4 return resultado;
5}
6
7// Ejemplo: función que suma dos números
8function sumar(a, b) {
9 return a + b;
10}
11
12console.log(sumar(5, 3)); // 8
13
14// Función sin parámetros
15function 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áticamente
25}
26
27const resultado = imprimirMensaje("Hola");
28console.log(resultado); // undefined

Parámetros por defecto

Parámetros por defectojavascript
1// En JavaScript puedes asignar valores por defecto
2function 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 defecto
10function crearUsuario(nombre = "Anónimo", edad = 18, activo = true) {
11 return {
12 nombre: nombre,
13 edad: edad,
14 activo: activo
15 };
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

Returnjavascript
1// Return detiene la ejecución de la función
2function esMayorDeEdad(edad) {
3 if (edad >= 18) {
4 return true; // Sale aquí si es mayor de edad
5 }
6 return false; // Solo llega aquí si no es mayor de edad
7}
8
9// Return puede devolver cualquier tipo de dato
10function obtenerDatos() {
11 return {
12 nombre: "Juan",
13 edad: 25,
14 hobbies: ["lectura", "programación"]
15 };
16}
17
18// Función sin return devuelve undefined
19function sinRetorno() {
20 const x = 5 + 3;
21 // No hay return
22}
23
24console.log(sinRetorno()); // undefined
25
26// Return temprano para validaciones
27function 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)); // 5
35console.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.

Expresiones de funciónjavascript
1// Expresión de función
2const sumar = function(a, b) {
3 return a + b;
4};
5
6console.log(sumar(5, 3)); // 8
7
8// La variable contiene la función
9const operacion = sumar;
10console.log(operacion(10, 5)); // 15
11
12// Funciones como argumentos
13function 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)); // 8
22console.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

Comparación de sintaxisjavascript
1// Función tradicional
2function sumar(a, b) {
3 return a + b;
4}
5
6// Arrow function equivalente
7const 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)); // 8

Diferentes formas de escribir arrow functions

Variaciones de sintaxisjavascript
1// Sin parámetros - necesitas paréntesis vacíos
2const saludar = () => "¡Hola!";
3console.log(saludar()); // "¡Hola!"
4
5// Un solo parámetro - paréntesis opcionales
6const doble = x => x * 2;
7const dobleConParentesis = (x) => x * 2;
8console.log(doble(5)); // 10
9
10// Múltiples parámetros - paréntesis obligatorios
11const sumar = (a, b) => a + b;
12console.log(sumar(3, 4)); // 7
13
14// Cuerpo con múltiples líneas - necesitas llaves y return
15const 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éntesis
23const crearPersona = (nombre, edad) => ({
24 nombre: nombre,
25 edad: edad
26});
27console.log(crearPersona("Ana", 25)); // { nombre: "Ana", edad: 25 }

Uso común: Callbacks en arrays

Arrow functions en métodos de arraysjavascript
1const numeros = [1, 2, 3, 4, 5];
2
3// Con función tradicional
4const 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 function
14const pares = numeros.filter(num => num % 2 === 0);
15console.log(pares); // [2, 4]
16
17// Reduce con arrow function
18const 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.

Scope de variablesjavascript
1// Variables globales - accesibles en todo el código
2const global = "Soy global";
3
4function mostrarScope() {
5 // Variable local - solo existe dentro de la función
6 const local = "Soy local";
7 console.log(global); // ✅ Puede acceder a global
8 console.log(local); // ✅ Puede acceder a local
9}
10
11mostrarScope();
12console.log(global); // ✅ Puede acceder a global
13// console.log(local); // ❌ Error: local no está definido
14
15// Ámbito de bloque con let y const
16function 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 if
23}
24
25// Parámetros de función tienen ámbito local
26function sumar(a, b) {
27 return a + b;
28}
29// console.log(a); // ❌ Error: a no existe fuera de la función

5. 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²)

Planteamientojavascript
1// Tu código aquí
2
3
4
5const peso = 70; // kg
6const altura = 1.75; // metros
7
8console.log(calcularIMC(peso, altura)); // 22.86
Ver solución
Soluciónjavascript
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.857142857142858
9
10// Opcional: redondear a 2 decimales
11function calcularIMCRedondeado(peso, altura) {
12 const imc = peso / (altura * altura);
13 return Math.round(imc * 100) / 100;
14}
15
16console.log(calcularIMCRedondeado(peso, altura)); // 22.86

Ejercicio 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.

Planteamientojavascript
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
Soluciónjavascript
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 if
10function 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.

Planteamientojavascript
1// Tu código aquí
2
3
4
5console.log(esPasswordSegura("abc123")); // false
6console.log(esPasswordSegura("password123")); // true
7console.log(esPasswordSegura("MiClave2024")); // true
Ver solución
Soluciónjavascript
1function esPasswordSegura(password) {
2 return password.length >= 8;
3}
4
5console.log(esPasswordSegura("abc123")); // false
6console.log(esPasswordSegura("password123")); // true
7console.log(esPasswordSegura("MiClave2024")); // true
8
9// Versión con if explícito
10function 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 completa
19function esPasswordMuySegura(password) {
20 if (password.length < 8) {
21 return false;
22 }
23 // Verificar que tenga al menos un número
24 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.

Planteamientojavascript
1// Tu código aquí
2
3
4
5console.log(contarVocales("Hola Mundo")); // 4
6console.log(contarVocales("JavaScript")); // 3
7console.log(contarVocales("Programación")); // 5
Ver solución
Soluciónjavascript
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")); // 4
15console.log(contarVocales("JavaScript")); // 3
16console.log(contarVocales("Programación")); // 5
17
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}