Considere a execução do código JavaScript abaixo, compatível . . .
Exercício 5
Considere a execução do código JavaScript abaixo, compatível com o ECMAScript 6, e a respectiva numeração das linhas de código na coluna à esquerda, e assinale a alternativa correta.
var a = 5;
var b = 10;
if(a === 5){
let a = 4;
var b = 1;
console.log(a);
console.log(b);
}
console.log(a);
console.log(b);
Após a execução do código, desconsiderando os caracteres de quebra de linha da função console.log(), o console apresentará:
Resolução
Parte 1 da resolução
Primeiramente devemos entender que existe uma diferença entre as declarações de variáveis em Javascript, usando var e let. Veja abaixo a diferença entre cada tipo de declaração:
let
vsvar
let
permite que você declare variáveis limitando seu escopo no bloco, instrução, ou em uma expressão na qual ela é usada. Isso é inverso da keyword var, que define uma variável globalmente ou no escopo inteiro de uma função, independentemente do escopo de bloco. Variáveis declaradas comlet
são "içadas" para começo do bloco em que elas são definidas (isso é conhecido também pelo termo, hoisting).Declarações de variáveis, onde quer que elas ocorram, são processadas antes que qualquer outro código seja executado. O escopo de uma variável declarada com
var
é seu contexto atual em execução, o qual é a função a qual pertence ou, para variáveis declaradas fora de qualquer função, o escopo é o global. Como as declarações de variáveis (e declarações em geral) são processadas antes de qualquer código seja executado, declarar uma variável em qualquer lugar no código é equivalente a declarar no início. Isso também significa que uma variável pode aparecer para ser usada antes dela ser declarada. Esse comportamento é chamado de "hoisting", a variável é movida para o início da função ou do código global.
Parte 2 da resolução
O segundo conceito que devemos aprender para chegarmos a solução do problema é: O Javascript permite redeclarar uma variável com o mesmo nome, sendo que irá prevalecer o último valor atribuído à variável de mesmo nome, conforme demonstrado no exemplo abaixo.
var a = 1;
var a = 2;
var b = 1;
console.log(a+b);
O comando console.log(a+b);
irá imprimir 3 pois a soma realizada foi do último valor atribuído a variável "a" com o valor atribuído a variável "b", ou seja, dois mais um resultando em três.
Parte 3 da resolução
Para chegarmos a resposta Letra A, o console apresentará as saídas 4, 1, 5 e 1. Perceba que o programa Javascript descrito no enunciado da questão possui dois escopos, o do próprio programa e o escopo relacionado ao bloco do comando if
.
O primeiro comando
console.log(a);
imprimirá o valor 4, pois a variávellet a = 4
dentro do escopo do comandoif
terá precedência sobre o que foi declarado no escopo do programa.O segundo comando
console.log(b);
imprimirá o valor 1, pois foi atribuído 1 a variável do contexto do programa, pelo comandovar b = 1;
O terceiro comando
console.log(a);
imprimirá o valor 5, pois fora do escopo do blocoif
a declaraçãolet a = 4;
não é usada, mas sim a declaração do escopo do programavar a = 5;
O quarto e último comando
console.log(b);
imprimirá o valor 1, pois primeiro prevalecerá a última declaraçãovar b = 1;
e a variável b é do escopo do programa e não do blocoif
.
Para exemplificar a última impressão do programa do enunciado do exercício, perceba que o programa simplificado abaixo imprimirá 1 pois var b = 1;
apesar de estar sendo atribuído dentro do escopo do if
pertencente ao escopo do programa.
var a = 5;
if(a === 5){
var b = 1;
}
console.log(b);
Resolva também as questões relacionadas abaixo sobre Javascript.
Considere a página
Considere o fragmento de programa JavaScript abaixo.
var st ...
Imagine o seguinte cenário: Marcelo lhe deve um dinheiro e promete pagar em parcelas mensais de R$ 7 ...