Funciones flecha (arrow functions) en JavaScript explicadas claramente
Jairo
Tras comprender las bases de HTML y CSS, el paso natural en desarrollo web es dominar variables, funciones y el scope en JavaScript. Las variables permiten guardar y actualizar datos; las funciones encapsulan lógica reutilizable; y el scope define dónde existe cada símbolo en el programa.
Una buena metáfora: el navegador es un pequeño “mundo”; las variables son cajitas con etiquetas, las funciones son recetas y el scope es el mapa que indica dónde se puede usar cada cosa.
Chuleta rápida (sin tablas):
En código moderno, la elección suele reducirse a let y const:
Buena práctica: comenzar con const y cambiar a let solo si se necesita reasignar.
// ✅ Reasignación necesaria → let let contador = 10; contador = 5; // ok // ✅ Sin necesidad de reasignar → const const API_URL = 'https://api.ejemplo.com'; // API_URL = 'https://otra.com'; ❌ Error: no se puede reasignar un const
Ojo con objetos/arrays en const: const bloquea la reasignación de la referencia, pero no impide mutar el contenido.
const lista = [1, 2]; lista.push(3); // ✅ permitido (mutación) lista = [1, 2, 3] // ❌ no: reasignación
var se eleva (hoisting) y no respeta el scope de bloque:
// Hoisting: la "declaración" de var sube; el valor no.
console.log(x); // undefined (no error)
var x = 7;
// Bloque ignorado por var:
if (true) {
var y = 10;
}
console.log(y); // 10 → sale del bloque
Checklist de decisión (sin tablas):
Una función se define con la palabra reservada function, un nombre opcional, una lista de parámetros entre paréntesis y un cuerpo entre llaves {}. También pueden crearse como expresión o mediante arrow functions.
// Declaración con nombre
function saludar(nombre) {
return `Hola, ${nombre}`;
}
// Expresión asignada a una variable
const despedir = function(nombre) {
return `Chao, ${nombre}`;
};
// Arrow function (sintaxis breve y this léxico)
const doble = n => n * 2;
function calcularTotal(items, tasa) {
const subtotal = items.reduce((s, it) => s + it.precio, 0);
return subtotal * (1 + tasa);
}
Las declaraciones de función se elevan completas:
console.log(square(3)); // 9
function square(n) { return n * n; }
En cambio, expresiones y arrows se elevan como variables (let/const): no pueden invocarse antes de su definición.
Existen tres niveles clave: global, de función y de bloque (llaves {} con let/const).
const global = '🌍';
function demo() {
const interno = '🔒 función';
if (true) {
const bloque = '🧱 bloque';
console.log(global); // ok
console.log(interno); // ok
console.log(bloque); // ok
}
// console.log(bloque); // ❌ fuera del bloque
}
demo();
// console.log(interno); // ❌ fuera de la función
Con let y const existe la Temporal Dead Zone (TDZ): desde que se entra al scope hasta la línea de declaración, la variable no está disponible.
// TDZ en acción // console.log(a); // ❌ ReferenceError let a = 1;
Un closure ocurre cuando una función recuerda el entorno donde se creó.
function crearSumador(x) {
return function(y) { return x + y; };
}
const sumar10 = crearSumador(10);
sumar10(5); // 15
Este patrón es base para contadores, encapsulación de estado y módulos simples.
Nota práctica: cuando “algo no existe”, conviene revisar en qué scope se está y si la variable ya fue declarada en ese punto.
Reasignación segura con let:
let nivel = 1; nivel++; // 2 console.log(nivel);
Evitar globales accidentales:
'use strict';
const boton = document.querySelector('#go');
// Declarar siempre con let/const para no crear globales sin querer
Declaración vs expresión vs arrow:
function area(r) { return Math.PI * r * r; }
const perimetro = function(r) { return 2 * Math.PI * r; };
const diametro = r => 2 * r;
TDZ mini-demo:
// console.log(msg); // ❌ ReferenceError (TDZ) const msg = 'Listo'; console.log(msg); // ✅
Ejercicio que reúne variable, función, closure y eventos.
HTML mínimo:
<button id="btn">Clicks: 0</button>
JS (al final del body o con defer):
function crearContador() {
let count = 0; // scope cerrado por el closure
return function incrementar() {
count++;
return count;
};
}
const incrementar = crearContador();
const btn = document.getElementById('btn');
btn.addEventListener('click', () => {
const n = incrementar();
btn.textContent = `Clicks: ${n}`;
});
Qué se refuerza (checklist):
¿var está “prohibido”?
No, pero en la práctica actual casi nunca es necesario; let y const ofrecen reglas más claras.
¿const impide mutar un objeto?
No. Impide reasignar la variable; el objeto interno puede mutar si el diseño lo admite.
¿Por qué aparece “Cannot access before initialization”?
Por la TDZ: se está intentando usar let/const antes de la línea de declaración.
¿Las arrow functions cambian this?
Sí: capturan el this léxico; conviene cuando se necesita ese comportamiento.
Dominar let/const, elegir correctamente el tipo de función y comprender el scope (global, función, bloque) previene una gran cantidad de errores. Con la chuleta de decisiones, los snippets y el mini-proyecto, se obtiene una base práctica y sólida para seguir avanzando con JavaScript.
No hay comentarios aún. ¡Sé el primero en comentar!
🍪 Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al continuar navegando, aceptas nuestro uso de cookies. Más información