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

4.5 KiB

id title challengeType videoUrl localeTitle
587d7b87367417b2b2512b40 Compare Scopes of the var and let Keywords 1 Comparar los alcances de la var y dejar Palabras clave

Description

Cuando declara una variable con la palabra clave var , se declara globalmente o localmente si se declara dentro de una función. La palabra clave let comporta de manera similar, pero con algunas características adicionales. Cuando declara una variable con la palabra clave let dentro de un bloque, una declaración o una expresión, su alcance se limita a ese bloque, declaración o expresión. Por ejemplo:
var numArray = [];
para (var i = 0; i <3; i ++) {
numArray.push (i);
}
console.log (numArray);
// devuelve [0, 1, 2]
console.log (i);
// devuelve 3
Con la var palabra clave, i es declarada a nivel mundial. Entonces, cuando se ejecuta i++ , se actualiza la variable global. Este código es similar al siguiente:
var numArray = [];
var i;
para (i = 0; i <3; i ++) {
numArray.push (i);
}
console.log (numArray);
// devuelve [0, 1, 2]
console.log (i);
// devuelve 3
Este comportamiento causará problemas si tuviera que crear una función y almacenarla 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 actualizada i .
var printNumTwo;
para (var i = 0; i <3; i ++) {
si (i === 2) {
printNumTwo = función () {
regreso i;
};
}
}
console.log (printNumTwo ());
// devuelve 3
Como se puede ver, printNumTwo() imprime 3 y no 2. Esto es porque el valor asignado a i se actualiza y el printNumTwo() devuelve el mundial i y no el valor i tenía cuando la función fue creada en el bucle. La palabra clave let no sigue este comportamiento:
'uso estricto';
deja printNumTwo;
para (sea i = 0; i <3; i ++) {
si (i === 2) {
printNumTwo = función () {
regreso i;
};
}
}
console.log (printNumTwo ());
// devuelve 2
console.log (i);
// devuelve "i no está definido"
i no está definido porque no se declaró en el ámbito global. Solo se declara dentro de la sentencia for loop. printNumTwo() devolvió el valor correcto porque se crearon tres variables i diferentes con valores únicos (0, 1 y 2) mediante la palabra clave let dentro de la instrucción de bucle.

Instructions

Fijar el código para que i declaradas en la sentencia if es una variable independiente que i declaré en la primera línea de la función. Asegúrese de no utilizar la palabra clave var en ningún lugar de su código. Este ejercicio está diseñado para ilustrar la diferencia entre cómo var y let palabras clave asignen un alcance a la variable declarada. Cuando se programa una función similar a la utilizada en este ejercicio, a menudo es mejor usar diferentes nombres de variables para evitar confusiones.

Tests

tests:
  - text: <code>var</code> no existe en el código.
    testString: 'getUserInput => assert(!getUserInput("index").match(/var/g),"<code>var</code> does not exist in code.");'
  - text: La variable <code>i</code> declaradas en la sentencia if debe ser igual a &quot;ámbito de bloque&quot;.
    testString: 'getUserInput => assert(getUserInput("index").match(/(i\s*=\s*).*\s*.*\s*.*\1("|")block\s*scope\2/g), "The variable <code>i</code> declared in the if statement should equal "block scope".");'
  - text: <code>checkScope()</code> debería devolver &quot;alcance de función&quot;
    testString: 'assert(checkScope() === "function scope", "<code>checkScope()</code> should return "function scope"");'

Challenge Seed

function checkScope() {
"use strict";
  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;
}

Solution

// solution required