Introducción a JavaScript

1

Fundamentos de JavaScript para Principiantes

2

Instalación y Configuración de JavaScript en Visual Studio Code

3

Instalación y configuración de Visual Studio Code y Node.js en Windows

4

Variables y Buenas Prácticas en JavaScript

5

Tipos de Datos en JavaScript: Primitivos y Complejos

6

Manipulación de Strings en JavaScript: Escritura, Concatenación y Substrings

7

Números y Operaciones Matemáticas en JavaScript

8

Conversión de Tipos en JavaScript: Implícita y Explícita

9

Conversión de Tipos en JavaScript: Explícita e Implícita

Estructuras de Control y Lógica

10

Operadores de Comparación en JavaScript: Igualdad y Desigualdad

11

Operadores Lógicos en Programación: AND, OR y NOT

12

Estructuras Condicionales: Uso de IF, ELSE y ELSE IF en JavaScript

13

Juego de Adivinanza: Programación con Estructuras Condicionales

14

Estructura y uso del condicional Switch en programación

15

Ciclo For: Iteración de Listas y Uso de Console.log en JavaScript

16

Iteración con for-of en JavaScript para arrays y strings

17

Iteración sobre Objetos con forIn en JavaScript

18

Uso del ciclo while para iteración en programación

19

Ciclos doWhile: Estructura y Diferencias con While

Funciones y This

20

Funciones en JavaScript: Cómo Calcular Precios con Descuentos

21

Diferencias entre Funciones y Métodos en JavaScript

22

Funciones Puras e Impuras en Programación: Conceptos y Ejemplos

23

Arrow Functions y Enlace Léxico en JavaScript

24

Scope y Contextos de Ejecución en JavaScript

25

Closures y Ámbito Léxico en JavaScript

26

Fundamentos del Desarrollo Web: Frontend y Backend

Manipulación de Arrays

27

Arrays: Propiedades, Acceso y Creación en Programación

28

Mutabilidad e inmutabilidad en arrays: conceptos y ejemplos prácticos

29

Métodos push y pop para modificar arrays en JavaScript

30

Métodos map y forEach en JavaScript: Uso y Ejemplos Prácticos

31

Métodos Filter y Reduce en JavaScript: Uso y Ejemplos Prácticos

32

Métodos find y findIndex en JavaScript: Uso y ejemplos prácticos

33

Uso del método slice para extraer porciones de un array en JavaScript

34

Uso del Spread Operator en JavaScript: Copia, Combinación y Más

Programación Orientada a Objetos

35

Programación Orientada a Objetos en JavaScript: Conceptos y Práctica

36

Creación y Manipulación de Objetos en JavaScript

37

Función constructora y gestión de instancias en JavaScript

38

Clases en JavaScript: Creación y Uso de Objetos con Sintaxis Moderna

39

Programación Orientada a Objetos en JavaScript: Clases y Prototipos

40

Prototipos y Herencia en JavaScript: Construcción y Uso Práctico

41

Métodos y herencia prototípica en JavaScript

42

Uso de "this" en Clases y Funciones Constructoras

43

Validación de Usuarios en una Red Social: Algoritmo Básico

44

Implementación de la Función Sign-In y Validación de Usuario

Asincronía en JavaScript

45

Programación Síncrona y Asíncrona en JavaScript

46

Promesas en JavaScript: Asincronía y Manejo de Estados

47

Uso de Async/Await para Promesas Asíncronas en JavaScript

48

Peticiones asíncronas con for await en JavaScript

49

Fundamentos de HTTP: Cliente-Servidor y Métodos de Petición

50

Peticiones HTTP en Frontend: Uso de Fetch y Análisis en Network

51

Peticiones HTTP en JavaScript: Fetch, GET, POST y DELETE

52

Envío de Datos al Servidor con JavaScript y Fetch API

53

Eliminar Posts con JavaScript y Delegación de Eventos

54

Manejo de IDs en JavaScript para eliminar artículos del DOM

55

Actualizaciones y Nuevas Funciones en JavaScript

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Scope y Contextos de Ejecución en JavaScript

24/55
Recursos

¿Qué son los contextos de ejecución y la cadena de alcances?

Los contextos de ejecución y la cadena de alcances son conceptos fundamentales en JavaScript, ya que determinan cómo y dónde se accede a las variables dentro del código. Al usar las palabras clave var, let, y const, es esencial comprender estas diferencias: el tipo de scope y el comportamiento de hoisting. Esto nos ayudará a tomar decisiones informadas sobre cuándo y cómo utilizar cada una.

¿Por qué es importante el scope en JavaScript?

El scope es crucial porque determina el alcance y la vida útil de una variable. Con var, las variables tienen un scope a nivel de función, mientras que let y const se limitan al bloque en el que se declaran. Esta distinción es vital para evitar errores y entender cómo se ejecuta el código.

Por ejemplo, consideremos el siguiente código:

const productName = "laptop";
const price = 899;
const brand = "techCode";

function getProductInfo() {
    const productName = "smartphone";
    const price = 499;
    return `${productName} costs ${price} and is of brand ${brand}`;
}

console.log(getProductInfo());

Aquí, el console.log imprime "smartphone costs 499 and is of brand techCode". Las variables productName y price dentro de la función sobrescriben las del contexto global, mientras que brand se toma desde el exterior debido a la cadena de alcances.

¿Cómo funciona el contexto de ejecución?

En JavaScript, el contexto de ejecución puede pensarse como muñecas rusas: el contexto global es la muñeca más grande y los contextos locales son las más pequeñas dentro de ella.

  • Contexto global: Incluye todas las variables y código que está por fuera de funciones o bloques.
  • Contextos locales: Son los bloques definidos, por ejemplo, dentro de una función.

¿Cómo se determina el contexto en un código?

A través del uso de llaves { }, podemos identificar los bloques que delimitan los contextos locales. Todo lo que cae fuera de estos bloques pertenece al contexto global.

let userPoints = 80;

function evaluatePoints() {
    if (userPoints < 100) {
        console.log("Below average");
    } else {
        console.log("Above average");
    }
}

console.log(evaluatePoints());

En el código anterior:

  • userPoints y console.log(evaluatePoints()) forman parte del contexto global.
  • evaluatePoints() es un contexto local que contiene su propio flujo de ejecución.

¿Qué es el scope chain o cadena de alcances?

La cadena de alcances define cómo JavaScript encuentra las variables. Un contexto local puede acceder a variables en contexto global, pero no al revés. La búsqueda de variables funciona de adentro hacia afuera, asegurándose de que no haya acceso entre contextos locales iguales.

¿Cuándo ocurre el error 'variable no definida'?

Esto ocurre cuando un contexto local busca una variable que no existe ni localmente ni en ningún contexto superior.

const globalVariable = "global1";

function local1() {
    console.log(globalVariable); // Accede correctamente a "global1"
    console.log(localVariable); // Error: localVariable no está definida

    function local2() {
        const carrot = "🥕";
        console.log(`local2: ${carrot}`);
    }

    function local3() {
        console.log(local3Variable); // Error aquí también
    }

    local2();
    local3();
}
console.log(local1());

En este ejemplo, intentar acceder a localVariable y local3Variable en contextos que no las definen o que no tienen acceso a ellas desencadena dichos errores.

Comprendiendo los errores de variable no definida

Es importante internalizar la restricción de que los contextos iguales no pueden comunicarse entre sí sin que compartan un contexto padre donde esté definida la variable de interés. Este entendimiento permitirá evitar múltiples errores en implementaciones más complejas, asegurando un manejo eficiente de cómo y dónde se posicionan y utilizan las variables.

Motívate a seguir profundizando en estos conceptos. La práctica y comprensión de cómo JavaScript maneja el scope y los contextos de ejecución te harán un desarrollador más hábil y capaz de escribir código más eficiente y sin errores.

Aportes 32

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

En JavaScript, los contextos de ejecución y la scope chain son conceptos fundamentales que permiten comprender cómo se ejecuta el código y cómo se accede a las variables. **Contexto de ejecución:** Un contexto de ejecución es un entorno en el que se ejecuta el código JavaScript. Contiene información sobre el código que se está ejecutando, como las variables declaradas, las funciones y el objeto global. Cada vez que se invoca una función, se crea un nuevo contexto de ejecución. **Scope Chain:** La scope chain es el mecanismo que utiliza JavaScript para determinar qué variables están disponibles para una instrucción en particular. Se busca en una secuencia de contextos de ejecución hasta encontrar la variable con el nombre correspondiente. **Pasos para la búsqueda en la scope chain:** 1. **Objeto de activación actual:** Se busca la variable en el objeto de activación del contexto de ejecución actual. 2. **Entorno externo:** Si no se encuentra la variable en el objeto de activación actual, se busca en el entorno externo, es decir, en el contexto de ejecución padre. 3. **Repetición:** El proceso se repite hasta encontrar la variable o llegar al objeto global. 4. **Variable no definida:** Si no se encuentra la variable en ningún contexto de ejecución, se genera un error de referencia. (Que eso fue justo lo que sucedio en el ejemplo final de la clase) **Conclusiones:** * Los contextos de ejecución y la scope chain son conceptos esenciales para comprender el funcionamiento del código JavaScript. * Los contextos de ejecución definen el entorno en el que se ejecuta el código, mientras que la scope chain determina qué variables están disponibles para una instrucción en particular. * La comprensión de estos conceptos es fundamental para escribir código JavaScript claro, organizado y libre de errores.
Este tema es sin duda tan fascinante como importante en JavaScript, debajo les comparto mi resumen sobre esta lección! ![](https://i.imgur.com/URqoAMe.png)
![](https://static.platzi.com/media/user_upload/image-a8656776-db68-48d9-a75c-8ccc635e8503.jpg) *resaltando por acá este importante cuadro, saludos!*
Mi ejercicio resuelto, el contexto local es lo que se encuentra dentro de las llaves y el contexto global es lo que se encuentra por fuera. Del contexto global no se puede acceder al contexto local, pero del contexto local si se puede acceder al contexto global. ![](https://static.platzi.com/media/user_upload/image-b77a0212-8039-4bb3-b28d-330a8ce70bd0.jpg)
Las **arrow functions** en JavaScript permiten una sintaxis más corta para definir funciones. Usan la sintaxis `() => {}` y no crean su propio contexto de `this`; en su lugar, heredan el `this` del contexto donde fueron definidas. Esto es especialmente útil en callbacks, donde se necesita mantener el contexto de la función padre. Ejemplo: ```javascript const obj = { value: 42, getValue: function() { return () => this.value; // 'this' se refiere a 'obj' } }; const func = obj.getValue(); console.log(func()); // 42 ``` En este caso, la arrow function no tiene su propio `this`, por lo que se obtiene el valor de `value` del objeto `obj`.
![](https://static.platzi.com/media/user_upload/image-b6ba8ae4-0333-47bd-af1c-cf9436c9c12f.jpg)
**MIS APUNTES:** ![](https://static.platzi.com/media/user_upload/image-9ff5a3ef-2dc7-4632-b67d-d191ade06b4b.jpg) ![](https://static.platzi.com/media/user_upload/image-2431c786-e3bf-458b-a184-0b95cda05e82.jpg)
he creado un artefacto que ilustra varios aspectos importantes de los contextos de ejecución y la scope chain en JavaScript. Aquí están algunos puntos adicionales y observaciones sobre los ejemplos: ```js // Ejemplo 1: Contextos de ejecución y scope chain básicos let globalVar = "Soy global"; function outerFunction() { let outerVar = "Soy outer"; function innerFunction() { let innerVar = "Soy inner"; console.log(innerVar); // Accede a variable local console.log(outerVar); // Accede a variable del contexto externo console.log(globalVar); // Accede a variable global } innerFunction(); } outerFunction(); // Ejemplo 2: Closures y scope chain function createCounter() { let count = 0; return function() { return ++count; } } const counter = createCounter(); console.log(counter()); // 1 console.log(counter()); // 2 // Ejemplo 3: Hoisting y TDZ (Temporal Dead Zone) console.log(hoistedVar); // undefined var hoistedVar = "Soy hoisted"; // console.log(tdz); // ReferenceError let tdz = "Temporal Dead Zone"; // Ejemplo 4: Scope en bloques (let y const) { let blockVar = "Solo visible en este bloque"; const BLOCK_CONST = "Constante de bloque"; } // console.log(blockVar); // ReferenceError // Ejemplo 5: This y contextos de ejecución const obj = { method: function() { console.log(this); } }; obj.method(); // 'this' se refiere a 'obj' const unboundMethod = obj.method; unboundMethod(); // 'this' se refiere al objeto global (en modo no estricto) // Ejemplo 6: Modificación del scope chain con 'with' (no recomendado) const withObj = { x: 10, y: 20 }; with (withObj) { console.log(x + y); // 30 } // Ejemplo 7: Módulos y scope // file1.js export const moduleVar = "Soy del módulo"; // file2.js import { moduleVar } from './file1.js'; console.log(moduleVar); // Notas adicionales: // - Cada función crea su propio contexto de ejecución. // - Los contextos de ejecución forman una pila (call stack). // - La scope chain se crea cuando se define una función, no cuando se ejecuta. // - Las arrow functions no crean su propio 'this', heredan el 'this' del contexto circundante. ```
Si a algunos de ustedes les quedó un poco de duda sobre las palabras claves var, let y const. Les recomiendo mucho que lean esta guía, despejará sus dudas. 👌👌 [Variables en JavaScript – Guía para principiantes sobre var, const y let](https://www.freecodecamp.org/espanol/news/javascript-variables-para-principiantes/)
\# \*\*Scope (Ámbito) en JavaScript\*\* El \*\*scope\*\* o \*\*ámbito\*\* determina dónde puedes acceder a una variable dentro de tu código. Dependiendo de dónde y cómo se declara una variable, su scope puede ser global, de función (local), de bloque, o del módulo. Si haces referencia a una variable, el motor de JavaScript buscará su declaración en el \*\*entorno\*\* más cercano, y seguirá buscando en entornos más lejanos hasta llegar a la línea de código que la \*\*variable esté declarada\*\*, pero no en viceversa. A este proceso se lo denomina \*\*cadena de scope\*\* *\*(scope chaining)\**. \## \*\*Tipos de Scope en JavaScript\*\* 1\. \*\*Scope Global\*\*:    - Las variables declaradas fuera de cualquier función o bloque tienen un ámbito global.    - Las variables globales son accesibles desde cualquier parte del código, incluidos dentro de funciones y bloques.        ```jsx    javascriptCopiar código    *let* globalVar = "Soy global";        *function* mostrarGlobal() {      console.log(globalVar);  // "Soy global"    }        mostrarGlobal();    console.log(globalVar);  // "Soy global"        ```    2. \*\*Scope de Función (Local)\*\*:    - Las variables declaradas dentro de una función tienen un ámbito local, es decir, sólo son accesibles dentro de esa función.    - No se puede acceder a estas variables fuera de la función.        ```jsx    javascriptCopiar código    *function* mostrarLocal() {      *let* localVar = "Soy local";      console.log(localVar);  // "Soy local"    }        mostrarLocal();    console.log(localVar);  // Error: localVar no está definida        ```    3. \*\*Scope de Bloque\*\*:    - Con la introducción de `let` y `const` en ES6, las variables pueden tener un ámbito de bloque.    - Las variables declaradas con `let` o `const` dentro de un bloque (`{}`) sólo son accesibles dentro de ese bloque.        ```jsx    javascriptCopiar código    if (true) {      *let* blockVar = "Soy un bloque";      console.log(blockVar);  // "Soy un bloque"    }        console.log(blockVar);  // Error: blockVar no está definida        ```    4. \*\*Scope de Módulo\*\* (ES6 y posteriores):    - En el contexto de los módulos de JavaScript (archivos `.js` importados/exportados), las variables declaradas en un módulo tienen un ámbito de módulo.    - No son accesibles fuera del módulo a menos que se exporten.        ```jsx    javascriptCopiar código    // modulo1.js    *let* moduloVar = "Soy un módulo";    export default moduloVar;        // main.js    import moduloVar from './modulo1.js';    console.log(moduloVar);  // "Soy un módulo"        ```    \### \*\*Hoisting y Scope\*\* \- \*\*Hoisting\*\*: Es el comportamiento de JavaScript donde las declaraciones de variables y funciones se mueven "arriba" de su scope antes de la ejecución del código. Esto significa que puedes usar variables y funciones antes de declararlas, aunque su valor será `undefined` si son variables.        ```jsx    javascriptCopiar código    console.log(x);  // undefined    *var* x = 10;        ```        - En el caso de `let` y `const`, aunque son hoisted, no se pueden utilizar antes de su declaración debido a lo que se llama "zona temporalmente muerta" (Temporal Dead Zone, TDZ).
En JavaScript, no se pueden tener contextos locales dentro de otros contextos locales. Cada función crea su propio contexto local, pero los contextos locales no pueden anidarse. Sin embargo, desde un contexto local puedes acceder a variables de un contexto global, pero no al revés. Es como las muñecas rusas: puedes abrir y ver dentro de una muñeca, pero no puedes agregar muñecas nuevas dentro de otra muñeca del mismo tamaño. Así, cada función mantiene su propio alcance sin anidamiento adicional.
El "scope chain" o cadena de alcances en JavaScript se refiere a la forma en que se organizan y acceden las variables en diferentes contextos de ejecución. Cada vez que se crea una función, se genera un nuevo contexto local que puede acceder a variables de su propio alcance y también a las variables del contexto global. Sin embargo, no se puede acceder a las variables locales de otros contextos. Por ejemplo, si tienes una variable definida globalmente, una función puede acceder a ella, pero no al revés. Esto es fundamental para entender el comportamiento de las variables al usar `var`, `let` o `const`, así como para manejar correctamente las funciones y su ámbito.
me encantan estas clases siento que son tecnicas, didácticas y faciles de aprender, sin perder el enfoque.
![](https://static.platzi.com/media/user_upload/image-9671e2d4-795d-4a41-94f1-2fe237ccc5dc.jpg)1 es globales 2 son locales
userPonts es global, message es local y se declara y asigna dos veces pero en una condicional que tambien es local con una funcion que tambien es local.
**Reglas del ámbito léxico:** * Cuando accedes a una variable dentro de una función, JavaScript primero busca en el ámbito **local** (dentro de la misma función o bloque donde se ejecuta). * Si no encuentra la variable en el ámbito local, sigue buscando en los ámbitos superiores, es decir, el **ámbito de la función que contiene la llamada** o el **ámbito global**.
![](https://static.platzi.com/media/user_upload/scope-b4916626-767c-43d6-969a-6a1ba4dbacb5.jpg) las lineas de color verde es global, luego las lineas amarrilas es local 1 y por ultimo las lineas azules es local 2 y 3 comenzando de arriba hacia abajo.![]()
Conocia que era pero no los nombres
4:25 sucede por que jamas se ejecuto la funcion?, y tomara los valores por el contxto de ejecucion
Del segundo ejemplo, es porque las constantes tienen un alcance global, osea que dentro de la función se pueden usar, pero como el console.log está fuera de la función, pues las modificaciones que se hagan dentro de ella, no impactan a las globales
Esta es la Mejor Clase que he visto me gusto mucho como esplicaron el alcanze de las variables deberian esplicar mas asi 💚
**Resumen** **Contexto de Ejecución:** Es el entorno donde se ejecuta un fragmento de código, que incluye variables, this, y ámbito. **Scope Chain:** Es la cadena de contextos de ejecución que se utiliza para buscar variables, empezando desde el contexto actual y subiendo hasta el contexto global si es necesario.
En el ejemplo 1, se declaró la función y la salida mostró las variables que encontró dentro de la función, así como las que pudieran estar fuera de la función. En el ejemplo 2, no se declaró la función. Por eso, el console.log solo tomó las variables que estaban fuera de la función.
La function en el ejemplo 2 no hubo llamado, por eso no hubo cambio.
Este tema se conoce como Alcance dependerá de la forma que declaremos las variables dentro del código.
![](https://static.platzi.com/media/user_upload/image-c23c8202-95a6-4465-a1f0-9efbd8099bd9.jpg) Como explica la profesora, el contexto global, al no invocar directamente la function el hace referencia a los contextos o en este caso las constantes que declaramos primero. ![](https://static.platzi.com/media/user_upload/image-5e60ea0f-d76d-4ff6-b351-72639c92a55b.jpg)
```js javascriptCopiar código let globalVar = "Soy global"; function mostrarGlobal() { console.log(globalVar); // "Soy global" } mostrarGlobal(); console.log(globalVar); // "Soy global" ```
| Keyword | Scope | Hoisting | Can be reassigned? | Can be redeclared? | |---------|----------|----------|--------------------|--------------------| | var | Function | Yes | Yes | Yes | | let | Block | No | Yes | No | | const | Block | No | No | No |
uno porque esta dentro de funcion por lo tanto el codigo esta por defecto a tomar las declarativas dela misma funcion ma que en el segundo como esta ´por fuera´´ tomo los primeras declarativas del codigo.
No entiendo la razón por la que dice la marca también cambio, la marca no cambio, sigue siendo la misma de la salida de la función. Marca solo se encuentra a un nivel, por eso siempre va a ser la misma.
En este caso el contexto local es todo el bloque de la función checkAccess y el global es la variable const y el console.log, por lo tanto ahí se va a mostrar el mensaje Access granted...![](https://static.platzi.com/media/user_upload/image-67fe33e2-5ea9-4982-8e1c-cdc9750a8d91.jpg)
Sí, en el segundo ejemplo toma los valores del contexto global cuando el `console.log` está fuera de la función. Esto se debe a que el `console.log` accede a las variables que están definidas en el contexto global, ignorando las variables internas de la función. Solo se puede acceder a las variables locales desde dentro de la función, pero desde el contexto global puedes acceder a las variables definidas fuera de la función, lo cual es un aspecto clave del scope en JavaScript.