freeCodeCamp/curriculum/challenges/espanol/02-javascript-algorithms-an.../es6/compare-scopes-of-the-var-a...

4.0 KiB

id title challengeType forumTopicId dashedName
587d7b87367417b2b2512b40 Compara el alcance de las palabras clave "var" y "let" 1 301195 compare-scopes-of-the-var-and-let-keywords

--description--

Si no estás familiarizado con let, echa un vistazo a este desafío.

Cuando declaras una variable con la palabra clave var, esta es declarada globalmente o localmente sí es declarada dentro de una función.

La palabra clave let se comporta de forma similar, pero con algunas características adicionales. Cuanto declaras una variable con la palabra clave let dentro de un bloque, una declaración o expresión. Su alcance está limitado a ese bloque, declaración o expresión.

Por ejemplo:

var numArray = [];
for (var i = 0; i < 3; i++) {
  numArray.push(i);
}
console.log(numArray);
console.log(i);

Aquí la consola mostrará los valores [0, 1, 2] y 3.

Con la palabra clave var, i es declarada globalmente. Así, cuando i++ es ejecutado, la variable global es actualizada. Este código es similar al siguiente:

var numArray = [];
var i;
for (i = 0; i < 3; i++) {
  numArray.push(i);
}
console.log(numArray);
console.log(i);

Aquí la consola mostrará los valores [0, 1, 2] y 3.

Este comportamiento causará problemas si creas una función y la almacenas para su uso posterior dentro de un bucle for que usa la variable i. Esto se debe a que la función almacenada siempre se referirá al valor de la variable global i actualizada.

var printNumTwo;
for (var i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo());

Aquí la consola mostrará el valor 3.

Como puedes ver, printNumTwo() imprime 3 y no 2. Esto es porque el valor asignado a i fue actualizado y la función printNumTwo() devuelve el global de i y no el valor que tenía i cuando la función fue creada en el bucle for. La palabra clave let no sigue este comportamiento:

let printNumTwo;
for (let i = 0; i < 3; i++) {
  if (i === 2) {
    printNumTwo = function() {
      return i;
    };
  }
}
console.log(printNumTwo());
console.log(i);

Aquí la consola mostrará el valor 2 y el error que i is not defined.

i no está definida, porque no ha sido declarada en el ámbito global. Solo ha sido declarada dentro de la sentencia de bucle for. printNumTwo() devolvió el valor correcto, porque tres variables diferentes de i con valores únicos (0, 1 y 2) fueron creadas por la palabra clave let dentro de la sentencia del bucle.

--instructions--

Corrige el código para que la variable i, declarada en la sentencia if sea una variable separada de la variable i, declarada en la primera línea de la función. Asegúrate de no utilizar la palabra clave var en ninguna parte de tu código.

Este ejercicio está diseñado para ilustrar la diferencia entre como las palabras claves var y let asignan ámbito a la variable declarada. Cuando programas una función similar a la que es usada en este ejercicio, es a menudo mejor usar diferentes nombres de variables para evitar confusión.

--hints--

var no debería existir en el código.

assert(!code.match(/var/g));

La variable i declarada en la sentencia if debe ser igual a la cadena block scope.

assert(code.match(/(i\s*=\s*).*\s*.*\s*.*\1('|")block\s*scope\2/g));

checkScope() debe devolver la cadena function scope

assert(checkScope() === 'function scope');

--seed--

--seed-contents--

function checkScope() {
  var i = 'function scope';
  if (true) {
    i = 'block scope';
    console.log('Block scope i is: ', i);
  }
  console.log('Function scope i is: ', i);
  return i;
}

--solutions--

function checkScope() {
  let i = 'function scope';
  if (true) {
    let i = 'block scope';
    console.log('Block scope i is: ', i);
  }

  console.log('Function scope i is: ', i);
  return i;
}