Funciones
Una función es un bloque de código con nombre que puedes guardar y ejecutar cuando quieras, tantas veces como necesites. Es la herramienta más importante para organizar programas: en lugar de repetir las mismas líneas una y otra vez, las escribes una sola vez y las llamas por su nombre.
Piensa en una receta: la escribes una vez (“batir, hornear, servir”) y cada vez que quieres el plato, sigues la receta con ingredientes distintos.
Objetivos
Sección titulada «Objetivos»Al terminar esta lección deberías ser capaz de:
- Declarar y llamar (invocar) una función.
- Distinguir parámetros de argumentos.
- Usar
returnpara devolver un valor. - Entender el ámbito local de las variables dentro de una función.
- Usar parámetros por defecto cuando falte un argumento.
- Evitar los errores típicos al trabajar con funciones.
¿Para qué sirven?
Sección titulada «¿Para qué sirven?»Sin funciones, un programa que saluda a tres personas repetiría el mismo código tres veces:
console.log("Hola, Ana");console.log("Hola, Luis");console.log("Hola, Marta");Con una función, la lógica se escribe una vez:
function saludar(nombre) { console.log("Hola, " + nombre);}
saludar("Ana");saludar("Luis");saludar("Marta");Ventajas concretas:
| Ventaja | Qué significa |
|---|---|
| Reutilizar | Escribes una vez, usas muchas. |
| Organizar | Cada función hace una tarea con nombre claro. |
| Corregir fácil | Si hay un error, lo arreglas en un solo sitio. |
| Probar por partes | Puedes comprobar cada función por separado. |
Anatomía de una función
Sección titulada «Anatomía de una función»function saludar(nombre) { return "Hola, " + nombre;}| Parte | Qué es | En el ejemplo |
|---|---|---|
function |
Palabra clave que declara la función | function |
| Nombre | Cómo la llamarás después | saludar |
(nombre) |
Lista de parámetros (datos que recibe) | nombre |
{ ... } |
Cuerpo: las instrucciones | return "Hola, " + nombre; |
return |
Valor que devuelve al terminar | "Hola, Ana" |
Declarar la función no ejecuta nada. Para que ocurra algo hay que llamarla (o invocarla) escribiendo su nombre seguido de paréntesis:
function saludar(nombre) { return "Hola, " + nombre;}
saludar("Ana"); // se ejecuta, pero el valor devuelto se pierdeconsole.log(saludar("Ana")); // "Hola, Ana" → ahora sí lo usamosParámetros y argumentos
Sección titulada «Parámetros y argumentos»Se parecen, pero no son lo mismo:
- Parámetro: el nombre que aparece en la definición (la “casilla” de la receta). →
nombre - Argumento: el valor real que pasas al llamar (el “ingrediente”). →
"Ana"
function sumar(a, b) { // a y b son PARÁMETROS return a + b;}
sumar(3, 5); // 3 y 5 son ARGUMENTOS → devuelve 8sumar(10, 20); // otros argumentos, misma función → devuelve 30Puedes tener cero, uno o muchos parámetros, separados por comas:
function presentarse(nombre, edad, ciudad) { return `${nombre} tiene ${edad} años y vive en ${ciudad}`;}
console.log(presentarse("Ana", 28, "Lima"));return: devolver un valor
Sección titulada «return: devolver un valor»return hace dos cosas a la vez:
- Entrega un valor a quien llamó a la función.
- Termina la función inmediatamente: lo que venga después no se ejecuta.
function esPar(numero) { return numero % 2 === 0; console.log("Esta línea nunca se ejecuta"); // detrás del return}
console.log(esPar(4)); // trueconsole.log(esPar(7)); // falseComo la llamada produce un valor, puedes usarla dentro de otras operaciones:
function doble(n) { return n * 2;}
console.log(doble(5) + 1); // 11console.log(doble(doble(3))); // 12 → una llamada dentro de otra
if (doble(4) > 5) { console.log("Es mayor que 5");}Si no hay return
Sección titulada «Si no hay return»Una función sin return devuelve undefined:
function mostrarMensaje() { console.log("Hola");}
const resultado = mostrarMensaje(); // imprime "Hola"console.log(resultado); // undefined// ❌ Muestra pero no devuelvefunction calcularIva(precio) { console.log(precio * 0.21);}
// ✅ Devuelve para que otros puedan usarlofunction calcularIva(precio) { return precio * 0.21;}Parámetros por defecto
Sección titulada «Parámetros por defecto»Puedes dar un valor de reserva por si no se pasa el argumento:
function saludar(nombre = "invitado") { return "Hola, " + nombre;}
console.log(saludar("Ana")); // "Hola, Ana"console.log(saludar()); // "Hola, invitado"Como vimos en null y undefined, el valor por defecto se activa con undefined (o con la ausencia del argumento), pero no con null.
Ámbito: las variables de dentro se quedan dentro
Sección titulada «Ámbito: las variables de dentro se quedan dentro»Las variables declaradas dentro de una función son locales: no existen fuera.
function calcular() { const temporal = 42; // solo vive aquí return temporal * 2;}
console.log(calcular()); // 84console.log(temporal); // ❌ ReferenceError: temporal is not definedDesde dentro sí puedes leer variables de fuera, pero no al revés:
const IVA = 0.21; // variable de fuera
function calcularTotal(precio) { return precio + precio * IVA; // ✅ se puede leer}
console.log(calcularTotal(100)); // 121Si una variable local se llama igual que una exterior, la local tapa a la otra:
const mensaje = "de fuera";
function mostrar() { const mensaje = "de dentro"; console.log(mensaje); // "de dentro"}
mostrar();console.log(mensaje); // "de fuera"Ejemplo completo: una pequeña calculadora de pedido
Sección titulada «Ejemplo completo: una pequeña calculadora de pedido»const IVA = 0.21;
function calcularSubtotal(precio, cantidad) { return precio * cantidad;}
function aplicarIva(subtotal) { return subtotal + subtotal * IVA;}
function formatear(total) { return total.toFixed(2) + " €";}
const subtotal = calcularSubtotal(12.5, 3); // 37.5const total = aplicarIva(subtotal); // 45.375
console.log("Subtotal:", formatear(subtotal)); // "37.50 €"console.log("Total:", formatear(total)); // "45.38 €"Fíjate en la idea: tres funciones pequeñas con nombres que dicen exactamente qué hacen. Es mucho más fácil de leer (y de corregir) que un único bloque enorme.
Documentar funciones
Sección titulada «Documentar funciones»Aquí encajan los comentarios JSDoc que vimos en la lección anterior:
/** * Devuelve true si el número es par. * @param {number} numero - Número a comprobar. * @returns {boolean} true cuando es par. */function esPar(numero) { return numero % 2 === 0;}Errores frecuentes
Sección titulada «Errores frecuentes»| Error | Qué pasa | Solución |
|---|---|---|
Olvidar los () al llamar |
Obtienes la función, no su resultado | Escribe saludar("Ana") |
Usar console.log en vez de return |
Fuera obtienes undefined |
Devuelve el valor con return |
Poner código después de return |
Nunca se ejecuta | Colócalo antes |
| Confundir parámetro y argumento | El valor no llega donde esperas | Revisa definición y llamada |
| Leer una variable local fuera | ReferenceError |
Devuélvela con return |
| Definir la función después de usarla | Código difícil de seguir | Declara antes de llamar |
Ejercicio
Sección titulada «Ejercicio»- Crea
function areaRectangulo(base, altura)que devuelva el área y pruébala con dos medidas distintas. - Escribe
esMayorDeEdad(edad)que devuelvatrueofalsey úsala dentro de unif. - Escribe
saludar(nombre = "invitado")y llámala con y sin argumento. - Escribe
function triple(n)que devuelvan * 3y úsala dentro de otro cálculo. - A propósito, cambia
returnporconsole.logen una función y comprueba qué obtienes al guardar su resultado en una variable.
Resumen
Sección titulada «Resumen»- Una función agrupa código con nombre para reutilizarlo; se declara una vez y se llama con
(). - Parámetros son los nombres en la definición; argumentos son los valores en la llamada.
returnentrega un valor y termina la función; sinreturnse obtieneundefined.- Las variables declaradas dentro son locales; desde dentro se puede leer lo de fuera.
- Los parámetros por defecto (
nombre = "invitado") cubren los argumentos ausentes. - Conviene declarar la función antes de llamarla para que el código se lea de arriba abajo.