3.9 KiB
id, title, challengeType, forumTopicId, dashedName
| 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--
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.
(getUserInput) => assert(!getUserInput('index').match(/var/g));
A variável i declarada dentro do corpo do comando if deve ser igual a string block scope.
(getUserInput) =>
assert(
getUserInput('index').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;
}