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

3.9 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--

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

La palabra let se comporta de forma similar, pero con algunas funciones adicionales. Cuanto declaras una variable con la palabra 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 se ejecuta la instrucción i++, 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 se debe a que el valor asignado a i se actualizó y la función printNumTwo() devuelve el valor de la variable i global 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 i is not defined.

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

--instructions--

Corrige el código para que la variable i, declarado 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 cómo las palabras clave var y let asignan alcance a la variable declarada. Al programar una función similar a la utilizada en este ejercicio, suele ser mejor usar diferentes nombres de variable para evitar confusiones.

--hints--

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

(getUserInput) => assert(!getUserInput('index').match(/var/g));

La variable i declarada en la instrucción if debe ser igual a la cadena block scope.

(getUserInput) =>
  assert(
    getUserInput('index').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;
}