Ámbito (scope)
Ya sabes declarar variables, escribir funciones y devolver valores. Otra regla decide si un nombre es alcanzable: el ámbito (scope). Responde: «desde aquí, ¿qué nombres puedo usar?»
Qué significa el ámbito
El ámbito es la zona del programa donde existe un nombre. Fuera, la misma escritura puede ser invisible — o apuntar a otro enlace. Piensa en habitaciones: una etiqueta en la cocina se ve en la cocina; no aparece sola en la calle.
Tres tipos cotidianos
📊 Ámbito global, de función y de bloque
| Tipo | Dónde vive el nombre | Herramientas típicas | ¿Dónde se ve? |
|---|---|---|---|
| global | fuera de toda función | let / const / var al nivel superior |
en todo el script (misma página) |
| función (local) | dentro del cuerpo | parámetros y locales | solo dentro de esa función |
| bloque | dentro de { } como if o bucle |
let y const |
solo dentro de ese bloque |
Estos tres cubren la mayor parte del código principiante. Los locales de función siguen privados. Los enlaces de bloque con let y const se quedan entre llaves. Los globales se comparten — útiles para un contador común, riesgosos si todo se vuelve global.
let city = "Tehran";
function showCity() {
console.log(city);
}
showCity();
console.log(city);
Los globales viven fuera de las funciones
city se declara en el nivel superior, así que la función y el console.log posterior lo leen. Cambia la cadena una vez; cada lector ve el valor nuevo. Prefiere globales solo cuando varias partes comparten de verdad un valor.
function greet() {
let message = "Hello";
console.log(message);
}
greet();
// console.log(message); // Error: message is not defined
Los locales se quedan en la función
message existe solo mientras corre greet. Fuera, ese nombre no está definido. Los parámetros igual: locales a la función que los lista.
if (true) {
let score = 10;
console.log(score);
}
// console.log(score); // Error: score is not defined
let y const respetan los bloques
Dentro de { }, un let o const solo se ve en ese bloque. Tras la llave de cierre, score desaparece. El var antiguo es de función y puede «filtrarse» del bloque. Prefiere let y const para que el borde del bloque signifique lo que parece.
let title = "Shop";
function show() {
let label = "open";
console.log(title + " is " + label);
}
show();
Lo anidado mira hacia afuera
show lee el title exterior y su propio label. La búsqueda va hacia afuera hasta hallar coincidencia. No hacia adentro: el código exterior no ve un nombre nacido solo dentro de la función.
let status = "ok";
function check() {
let status = "busy";
console.log(status);
}
check();
console.log(status);
Sombreado: dentro gana el interno
Dentro de check, el status local oculta al externo. La llamada imprime busy. Al terminar, el externo sigue ok. Misma escritura, dos enlaces — el ámbito decide cuál tocas.
Mostrar un valor con ámbito en la página
Guarda una etiqueta global, construye en una función una línea que aún pueda leerla y escribe el resultado en un párrafo.
<!DOCTYPE html>
<html>
<head>
<title>scope — page</title>
</head>
<body>
<p id="msg">…</p>
<script>
let place = "Garden";
function line() {
let state = "open";
return place + " is " + state;
}
let box = document.getElementById("msg");
box.textContent = line();
</script>
</body>
</html>
El párrafo muestra Garden is open. place es global; state es local a line. La función lee ambos, devuelve una cadena y la página la muestra. Cambia solo place, actualiza y lee la línea. Siguiente: closures — funciones que mantienen nombres exteriores vivos tras terminar la llamada exterior.
Pasos de práctica
- Declara un
let app = "demo"global y regístralo desde una función pequeña y desde fuera. - Pon
let secret = 1dentro de una función; confirma que registrarsecretfuera lanza error. - Dentro de
if (true) { }declaralet n = 5y regístralo; prueba después del bloque. - Desde una función anidada lee un
letexterior sin redeclararlo. - Sombrea
let tag = "A"exterior conlet tag = "B"interior y registra ambos sitios. - En la demo HTML cambia solo la cadena
place, actualiza y lee el párrafo.
Errores frecuentes
- Usar un local fuera de su función — ReferenceError, no un vacío silencioso
- Esperar que
varen un bloque se quede privado comolet - Suponer que el código exterior ve nombres nacidos solo dentro de una función anidada
- Mezclar ámbito con
return— uno es visibilidad; el otro envía un valor - Esperar aquí la lección completa de closures — eso es la página siguiente
Resumen
- El ámbito es dónde se ve y usa un nombre
- Los globales viven fuera de las funciones y se comparten en el script
- Locales y parámetros se quedan en su función
letyconstdentro de{ }son de bloque; mejor que unvarque filtra- Lo anidado puede leer hacia afuera; afuera no ve nombres solo internos
- Un enlace interno con el mismo nombre sombrea al externo
- La página puede combinar global y local en una cadena devuelta
- Siguiente: closures — funciones que recuerdan nombres exteriores
🧠 Pon a Prueba tu Conocimiento
Pon a Prueba tu Conocimiento
Ponte a prueba con este cuestionario interactivo y descubre qué tan bien entiendes el tema
📝 Instrucciones
- Lee cada pregunta cuidadosamente
- Selecciona la mejor respuesta para cada pregunta
- Puedes repetir el quiz tantas veces como quieras
- Tu progreso se mostrará en la parte superior