No tienes acceso a esta clase

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

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

11 Días
14 Hrs
5 Min
27 Seg

Uso correcto de var, let y const

4/24
Recursos

Aportes 28

Preguntas 3

Ordenar por:

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

Clase 4: Uso correcto de var, let y const

Notas

  • ECMAScript 6 2015 -> introducjo let y const
  • var -> no respeta ambitos de bloque
  • let -> si respeta ambitos de bloque
  • const -> valores que no cambian NUNCA pero pueden cambiar por referencia, pero la constante en sí no puede ser reasignada
// var
var age = 28;
{
  console.log("Valor dentro del bloque", age); // 28
  var age = 29;
}

console.log("Valor fuera del bloque", age); // 29
age = age * 2;
console.log("Valor cambiado", age); // 58

// let
let age = 28;
{
  console.log("Valor dentro del bloque", age); // error
  let age = 29;
}

console.log("Valor fuera del bloque", age); // 28
age = age * 2;
console.log("Valor cambiado", age); // 56

// const
const PI = 3.14159;
PI = PI * 2; // error
console.log("Valor cambiado", PI); // no se ejecuta
Es bueno señalar que en let respeta el ámbito de bloque, pero esto no evita que no se pueda acceder a una variable letra desde dentro de un bloque. El error que lanza aquí es que hay una variable let con el mismo nombre dentro de ese bloque, pero si la quitamos, el primer console.log podría acceder a la primer variable age que se declara en el ámbito global. Los bloques definidos por los corchetes pueden acceder a variables externas si no cuentan con una del mismo nombre, pero desde afuera no se puede acceder a las variables declaradas o inicializadas dentro de los bloques

Recomiendo este curso breve donde se explica muy clarito también las diferencias entre “var”, “let” y “const” y las características a profundidad de c/u: https://platzi.com/cursos/javascript-closures-scope/

let age = 28
{    
    console.log('valor dentro del bloque', age);
    let age = 29;
}

// sale ReferenceError: Cannot access ‘age’ before initialization

El primer console.log no imprime el valor 28 porque ocurre un hoisting en JavaScript. El hoisting es un comportamiento donde las declaraciones de variables (pero no las asignaciones) se mueven al principio del ámbito en el que se encuentran.
Debido al hoisting, la declaración de la segunda variable age se mueve al principio del bloque, por lo que cuando se ejecuta la línea 2 del console.log dentro del bloque, la variable age todavía no ha sido asignada y su valor es undefined

var - no respeta ambitos de bloque

let - si respeta ambitos de bloque

const - valores que no cambian NUNCA

Me parece importante aclarar que en el ejemplo de let, cuando se llama a la variable variable global dentro del bloque y da error, es porque se está declarando otra variable con el mismo nombre dentro del bloque (después del console.log). Podríamos tranquilamente acceder al valor de una variable let declarada globalmente desde adentro de un bloque, siempre y cuando no volvamos a declararla dentro del mismo.

let y var, aunque parezcan muy diferentes, realmente no lo son. Son exactamente lo mismo, solo que el engine de JS las trata de manera distinta.
.
Toma en cuenta los siguientes bloques de código

{
  console.log("Value inside the block:", age); // Error ❌
  let age = 22;
}

{
  console.log("Value inside the block:", age); // undefined
  var age = 22;
}

Lo que pasa por debajo, es que cada que se crea un nuevo “bloque”, se crea un nuevo contexto de ejecución, justo como el que se crea de manera global.
Entonces, este contexto lo que hace es primero, agregar todas las variables y funciones en la memoria, por esta razón ocurre el hoisting.
.
En el ejemplo de arriba, en ambos contextos de ejecución, la variable “age” existe en memoria desde antes de que se ejecute cualquier línea de código. A esta variable se le da un valor de “undefined”. Sin embargo, el engine de JS trata a las variables de manera distinta, según si fueron declaradas con let o con var.
.
En case de que fueron declaradas con let, el engine de JS no deja que se pueda acceder a esta variable antes de que haya sido declarada explicitamente en el código, por eso nos da un error.
.
En el caso de var, si nos deja acceder a esta variable, que es “undefined”, por lo que no nos da ningún tipo de error.

Como var no tiene en cuentas los bloques o scopes, en este ejemplo imprime:
28
29
58
Primer comment en un curso 😁

Ejemplo de uso de var - age ![](https://static.platzi.com/media/user_upload/Captura%20de%20Pantalla%202024-11-07%20a%20la%28s%29%2013.53.52-f8493413-7080-4320-9458-3fd77b513d80.jpg)
Pensé que el console.log de la línea 5 no daría error y mostraría simplemente 28 ya que, si bien estamos declarando una variable age en la línea de debajo... La variable age de la línea 2 está declarada de forma global por lo que cualquiera debería poder usarla incluso si se encuentra dentro de otro bloque de código. Por lo visto, si en el bloque de código estamos declarando una nueva variable con el mismo nombre que una variable global de fuera, dentro del bloque de código la que se usa es la que se declara dentro incluso cuando la usamos antes de la declaración en sí misma. En otras palabras, si el código no tuviera la declaración de la variable age en la línea 6, no daría error y se imprimiría 28, pero como la tiene, ese bloque en concreto asume que el age que se está llamando en el console.log es la declarada en la línea de abajo y no el age global de fuera.
el ambito de bloque es lomismo que o entra dentro de la categoria de scope? o contexto? porque como lo entendi cuando estaba entendiendo el this en js es que var es para el contexto global y let para los scope locales, sin embargo habia entendido(la coscina del codigo se llama el canal de youtube) que estos contextos eran creados con el llamado o declaracion de una funcion, no con la instanciacion de objetos, pero lo planteado en esta clase me hace caer en cuenta que ambos, objetos y funciones son "delimitados " por {llaves} de ahi mi duda . el ambito de bloque es lomismo que o entra dentro de la categoria de scope? o contexto?
Declaración y Scope: * `var`: Function-scoped o global-scoped. * `let` y `const`: Block-scoped. Hoisting: * `var`: Se eleva al inicio de su scope, inicializada como `undefined`. * `let` y `const`: Se elevan pero no se inicializan (Temporal Dead Zone). Entrega ReferenceError. Reasignación: * `var` y `let`: Permiten reasignación. * `const`: No permite reasignación, pero los objetos/arrays pueden ser mutados. Temporal Dead Zone (TDZ): * Afecta a `let` y `const`. * Periodo entre el inicio del bloque y la declaración de la variable. Rendimiento: * `const` puede permitir optimizaciones del motor JS. * Acceder a variables en el scope local es más rápido que en scopes externos. Uso de memoria: * `var` en el scope global puede permanecer en memoria durante toda la ejecución. * `let` y `const` se liberan cuando sale del scope. Buenas prácticas: * Preferir `const` para valores que no se reasignarán. * Usar `let` para variables que se reasignarán. * Evitar `var` en código moderno.
//var => No respeta ámbitos de bloque y se puede volver a declarar
var age1 = 28

{
    console.log("Valor dentro del bloque ", age1); //28
    var age1 = 29
}

console.log("Valor fuera del bloque ", age1) //29
age1 = age1*2
console.log("Valor cambiado", age1);//58

//let => Respeta ámbitos de bloque y no se puede volver a declarar
let age2 = 28

{
    console.log("Valor dentro del bloque ", age2); //Cannot access 'age2' before initialization
    let age2 = 29
}

console.log("Valor fuera del bloque ", age2) //28
age2 = age2*2
console.log("Valor cambiado", age2);//56


//const => Respeta ámbitos de bloque y no puede cambiar de valor
const PI = 3.14159;
PI = PI * 2; // Assignment to constant variable.
console.log("Valor cambiado", PI); // no se ejecuta
28
29
58

\## Que es el scope ES el alcance que determina la accesibilidad de las variables. \#### Tipos de scope \- \[\[Global scope]] \- \[\[Function scope]] \- \[\[Block scope]] \### JavaScript Variables En JavaScript, los objetos y las funciones también son variables EL \_scope\_ determina la accesibilidad de variables, objetos y funciones desde diferentes partes del código. ## Block scope. let and const have a block scope ### assignation and declaration La re-declaración es volver a declarar una variable, y la reassignment es volver a asignar un valor. \- Una variable declarada con `var` puede ser re-declarada y reasignada. \- Una variable declarada con `let` puede ser reasignada, pero no re-declarada. \- Una variable declarada con `const` no puede ser re-declarada, ni reasignada. Su declaración y asignación debe ser en una línea, caso contrario habrá un error. Existe un curso de [ECMAScript 6+](https://platzi.com/cursos/ecmascript-6/) para que descubras las nuevas características que agregan al lenguaje. ## Que es un closure Tienes una closure cuando una function cualquiera accede a una variable fuera de su contexto y la recuerda un closure Permite acceder al ambit de una function exterior desde una function interior. En JavaScript, los closures de crean cada vez que una function es creada. A diferencia de lo otros conceptos los closures no son siempre utilizados. ```js // lexical const myGlobal = 0; function myFunction(){ const myNumber = 1; console.log(myGlobal) function parent(){ // intern Function const inner = 2; console.log(myNumber,myGlobal) function child(){ console.log( inner, myNumber, myGlobal) } return child(); } return parent(); } myFunction() ```### Asi seria un uso practico de closures ```js function moneyBox(){ let saveCoins = 0; function countCoins(coins){ saveCoins += coins; console.log(`MoneyBox: ${saveCoins}`) } return countCoins; } const myMoneyBox = moneyBox(); myMoneyBox(5); myMoneyBox(30); // output = 35 ```**Me canse de editar esto solo tomen el curso de closures y scope de javascript. si aun no lo an tomado aunque tecnicamente ya debieron hacerlo.**
summary don't use (var)



La principal característica de var es que tiene un alcance de función, lo que significa que su valor puede filtrarse fuera de los bloques de código donde se declaró. Esto podría causar problemas de legibilidad y mantenimiento.

Usa let cuando quieras declarar una variable que puede cambiar su valor.
Usa const cuando quieras declarar una constante con un valor que no cambiará.
Evita usar var en favor de let y const, ya que let es más seguro y predecible.

<code> 

28
29
58

Un tips aprendido en el curso de TypeScript es qué, se puede activar el analizador de código estático en JavaScript puro colocando en el inicio del script js el siguiente código:

//@ts-check

Esto nos permitirá detectar errores comunes y dificiles de visualizar a simple vista antes de subir nuestro código al server.

En el ejercicio se imprime:

Valor dentro del bloque 28
Valor fuera del bloque 29
Valor cambiado 58

Como recomendaciones:

  • Nunca usen var.
  • Usen let cuando vayan a redeclarar el valor en la variable.
  • Usen const para constantes, cuando no es necesario redeclarar la variable. Por ejemplo: Al usar librerías, al crear funciones u objetos, etc.

Vaya no sabia que usando clg directamente imprimia el console.log en Vscode… el dia ya valio la pena.

28
29
58

Valor dento del bloque 28
Valor fuera del bloque 29
Valor cambbiado 58

Imprime:

  • Valor dentro del bloque 28
  • Valor fuera del bloque 29
  • Valor cambiado 58