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

4.0 KiB

id title challengeType forumTopicId dashedName
587d7b87367417b2b2512b40 Comparar escopos das palavras-chave var e let 1 301195 compare-scopes-of-the-var-and-let-keywords

--description--

Se você não estiver familiarizado com let, confira este desafio.

Quando você declara uma variável com a palavra-chave var, ela é declarada globalmente, ou localmente se declarada dentro de uma função.

A palavra-chave let se comporta de forma similar, mas com alguns recursos extras. Quando você declara a variável com a palavra-chave let dentro de um bloco, declaração, ou expressão, seu escopo é limitado ao bloco, declaração, ou expressão.

Por exemplo:

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

Aqui o console vai exibir os valores [0, 1, 2] e 3.

Com a palavra-chave var, i é declarado globalmente. Então quando i++ é executado, ele atualiza a variável global. Esse código é semelhante ao seguinte:

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

Aqui o console vai exibir os valores [0, 1, 2] e 3.

Este comportamento causará problemas se você criasse uma função e armazená-la para depois utilizar dentro de um laço for que utiliza a variável i. Isso se deve ao fato da função armazenada sempre vai se referir ao valor da variável global i atualizada.

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

Aqui o console vai exibir o valor 3.

Como você pode ver, printNumTwo() exibe 3 e não 2. Isso se deve ao fato do valor atribuído a i foi atualizado e printNumTwo() retorna a variável global i e não o valor que i tinha quando a função foi criada dentro do laço for. A palavra-chave let não segue este comportamento:

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

Aqui o console vai exibir o valor 2, e um erro que i is not defined (i não foi definida).

i não foi definida porque não foi declarada no escopo global. Ela é declarada apenas dentro da declaração do laço for. printNumTwo() retornou o valor correto porque três variáveis i distintas com valores únicos (0, 1 e 2) foram criadas com a palavra-chave let dentro da declaração do laço.

--instructions--

Corrija o código para que a variável i declarada dentro do comando if seja diferente da variável i declarada na primeira linha da função. Tenha certeza de não usar a palavra-chave var em nenhum lugar do seu código.

Este exercício foi projetado para ilustrar a diferença ente como as palavras-chaves var e let definem o escopo para a variável declarada. Quando programamos uma função semelhante a aquelas utilizadas no exercício, geralmente, é melhor utilizar variáveis distintas para evitar confusão.

--hints--

var não deve existir no código.

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

A variável i declarada dentro do corpo do comando if deve ser igual a string block scope.

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

checkScope() deve retornar a string 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;
}