JavaScript Medio · Teoría

Comprende antes de memorizar

22 lecciones originales con ejemplos breves, puntos clave y referencias para profundizar.

01

Scope global, local y de bloque

Cada declaración pertenece a un entorno léxico. Las funciones crean alcance local y los bloques delimitan let y const.

Ejemplo
const global = "curso";
function leer() { const local = global; return local; }

Puntos importantes

  • El código interno puede leer ámbitos exteriores.
  • El exterior no puede leer nombres internos.
02

Closures y memoria léxica

Una función conserva acceso al entorno donde fue creada incluso después de terminar la llamada exterior.

Ejemplo
function contador() {
  let valor = 0;
  return () => ++valor;
}
const siguiente = contador();

Puntos importantes

  • Cada closure conserva su propio entorno.
  • El cierre surge del alcance léxico.
03

Hoisting y zona temporal

Las declaraciones se procesan antes de ejecutar el cuerpo, pero no todas pueden usarse igual. let y const permanecen inaccesibles hasta su inicialización.

Ejemplo
saludar();
function saludar() { console.log("hola"); }

Puntos importantes

  • Las function declarations pueden llamarse antes.
  • No dependas del hoisting para ocultar el orden lógico.
04

Declaraciones y expresiones de función

Una declaración introduce un nombre en su ámbito. Una expresión crea una función como valor y puede asignarse a una constante.

Ejemplo
function sumar(a, b) { return a + b; }
const restar = function (a, b) { return a - b; };

Puntos importantes

  • Las funciones son valores.
  • La forma elegida afecta su disponibilidad temprana.
05

Arrow functions

Las funciones flecha ofrecen sintaxis compacta y capturan this del entorno exterior. No reemplazan todos los usos de function.

Ejemplo
const cuadrado = (n) => n * n;
console.log(cuadrado(5));

Puntos importantes

  • El retorno puede ser implícito.
  • No uses flecha como constructor.
Practicar este concepto
06

Callbacks

Un callback es una función entregada para que otro código la invoque. Permite separar una operación de la acción aplicada.

Ejemplo
function aplicar(valor, accion) { return accion(valor); }
console.log(aplicar(3, (n) => n + 1));

Puntos importantes

  • Pasa la función, no su resultado.
  • El receptor decide cuándo invocarla.
Practicar este concepto
07

Funciones de orden superior

Una función de orden superior recibe funciones, devuelve funciones o hace ambas cosas. Es la base de muchas transformaciones declarativas.

Ejemplo
const multiplicarPor = (factor) => (n) => n * factor;
const triple = multiplicarPor(3);

Puntos importantes

  • Las funciones pueden componer comportamiento.
  • Un closure puede guardar configuración.
08

Destructuring

La desestructuración extrae posiciones de arrays o propiedades de objetos hacia nombres locales.

Ejemplo
const perfil = { nombre: "Mara", rol: "editora" };
const { nombre, rol } = perfil;

Puntos importantes

  • Puede incluir valores predeterminados.
  • Los nombres de objeto deben coincidir o renombrarse.
Practicar este concepto
09

Spread y rest

La sintaxis ... expande valores en un nuevo contexto o reúne argumentos restantes. El significado depende de la posición.

Ejemplo
const base = [1, 2];
const copia = [...base, 3];
const sumar = (...nums) => nums.reduce((a, n) => a + n, 0);

Puntos importantes

  • Spread no crea copias profundas.
  • Rest debe ocupar la última posición.
Practicar este concepto
10

Transformar con map

map construye un array nuevo aplicando un callback a cada elemento sin alterar por sí mismo el original.

Ejemplo
const dobles = [2, 4, 6].map((n) => n * 2);

Puntos importantes

  • El resultado conserva la longitud.
  • Devuelve el valor transformado desde el callback.
Practicar este concepto
12

Acumular con reduce

reduce combina una colección en un acumulador. Un valor inicial explícito vuelve más predecible el contrato.

Ejemplo
const total = [3, 5, 7].reduce((suma, n) => suma + n, 0);

Puntos importantes

  • El acumulador pasa entre iteraciones.
  • El valor inicial evita errores en arrays vacíos.
Practicar este concepto
14

Referencias y copias superficiales

Objetos y arrays se manipulan mediante referencias. Spread crea otro contenedor, pero sus valores anidados continúan compartidos.

Ejemplo
const original = { config: { tema: "claro" } };
const copia = { ...original };

Puntos importantes

  • === compara identidad entre objetos.
  • Una copia superficial no clona niveles internos.
Practicar este concepto
15

Optional chaining y nullish coalescing

?. detiene un acceso cuando encuentra null o undefined. ?? usa un reemplazo sólo para esos dos valores.

Ejemplo
const usuario = {};
console.log(usuario.contacto?.email ?? "sin correo");

Puntos importantes

  • ?? conserva 0, false y la cadena vacía.
  • ?. no corrige nombres mal escritos.
16

try, catch y finally

try delimita operaciones que pueden fallar. catch recibe el error y finally se ejecuta al terminar cualquiera de los caminos.

Ejemplo
try { JSON.parse("{"); } catch (error) { console.error(error.name); } finally { console.log("fin"); }

Puntos importantes

  • Captura donde puedas responder al fallo.
  • finally sirve para limpieza.
Practicar este concepto
17

Crear errores con throw

throw interrumpe el flujo normal con un valor. Usar instancias de Error conserva mensaje y traza útiles.

Ejemplo
function dividir(a, b) {
  if (b === 0) throw new Error("Divisor inválido");
  return a / b;
}

Puntos importantes

  • Valida contratos cerca de su frontera.
  • No uses excepciones como bifurcación habitual.
18

Serializar datos con JSON

JSON.stringify convierte datos compatibles en texto y JSON.parse reconstruye un valor a partir de texto JSON válido.

Ejemplo
const texto = JSON.stringify({ tema: "js" });
const dato = JSON.parse(texto);

Puntos importantes

  • JSON no representa funciones ni undefined.
  • parse puede lanzar SyntaxError.
Practicar este concepto
19

Promises

Una Promise representa un resultado futuro que puede cumplirse o rechazarse. then y catch registran continuaciones.

Ejemplo
Promise.resolve(4)
  .then((n) => n * 2)
  .then(console.log);

Puntos importantes

  • then devuelve otra Promise.
  • Un rechazo debe manejarse.
Practicar este concepto
20

async y await

Una función async siempre devuelve una Promise. await pausa esa función hasta que el valor se resuelve, sin bloquear todo el entorno.

Ejemplo
async function obtener() {
  const valor = await Promise.resolve(9);
  return valor;
}
console.log(await obtener());

Puntos importantes

  • try/catch gestiona los rechazos alrededor de await.
  • Las operaciones independientes pueden iniciarse antes de esperar.
Practicar este concepto
21

Event loop y tareas

El código síncrono termina antes de procesar continuaciones de Promises. Esas continuaciones usan la cola de microtareas.

Ejemplo
console.log("A");
Promise.resolve().then(() => console.log("B"));
console.log("C");

Puntos importantes

  • El orden observado es A, C, B.
  • await también programa una continuación.
22

Módulos: import y export

Los módulos permiten declarar dependencias explícitas entre archivos mediante export e import. El navegador resuelve módulos bajo reglas distintas de un script clásico.

Ejemplo
// calculos.js
export const doble = (n) => n * 2;
// app.js
import { doble } from "./calculos.js";

Puntos importantes

  • Las importaciones estáticas van en el nivel superior.
  • El playground no ejecuta import ni export; se estudian como teoría.