Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Aula 9 - Atividade 1: Por quê a variável achou não pode vir antes de verifica?

Boa tarde, pessoal!

É o seguinte, estava refazendo o código da aula, e defini a variável achou antes da função verifica.

    var achou = false;

    function verifica () {

Dessa forma, quando errava o "segredo", não aparecia nenhum alerta.

Tentei diversas modificações, até perceber que só apareceria o alerta de erro caso a variável fosse definida dentro da função.

    function verifica () {

        var achou = false;

Porém, não consigo entender o porquê disso.

Se a variável já está definida desde o início, após clicar no botão, e o programa verificar que não houve acerto, por quê o if responsável por alertar o erro não é selecionado?

Aqui está o código inteiro, para o caso de haver mais coisas que não percebi:

<meta charset="UTF-8">

<input/>

<button>Entra</button>

<script>

    var input = document.querySelector("input");

    var segredos = [2, 7, 10, 5];

    input.focus();

    var achou = false;

    function verifica () {

        for(var posicao = 0; posicao < segredos.length; posicao++) {

            if(input.value == segredos[posicao]) {

                alert("Você acertou!");

                var achou = true;

                break;
            }
        }

        if(achou == false) {

            alert("Você errou!");
        }

        input.value = "";

        input.focus();
    }

    var button = document.querySelector("button");

    button.onclick = verifica;

</script>

Por favor, me ajudem. Tô tentando entender isso faz tempo. rs

6 respostas
solução!

Boa tarde, Anderson! Como vai?

Veja que vc cria uma variável chamada achou tanto fora da função verifica() quanto dentro dessa função. Sendo assim, ao erra o chute, quando o JavaScript chega no trecho if(achou == false) que se encontra dentro da função verifica(), o valor de achou é undefined. Isso ocorre pq o JavaScript já sabe que vc possivelmente criará uma variável achou dentro da função verifica(). Só que errando o chute em momento nenhum vc define um valor para essa variável, fazendo com que ela dentro da função fique com o valor undefined. Então, para resolver o seu problema, basta trocar de var achou = true; para achou = true; dentro da função verifica(). Assim, o que o JavaScript irá fazer é considerar que em todos os momentos do seu código vc está fazendo referência à mesma variável achou que foi definida fora da função.

Para atestar isso que eu estou falando, antes de fazer a correção que indiquei, experimente fazer console.log(achou); dentro da função verifica() e vc verá que o valor impresso ao errar o chute sera undefined.

Entretanto, fazendo apenas essa correção vc irá cair em outro erro! Vida de programador: vc resolve um erro e cai em outro!

DESAFIO: Vc consegue identificar qual será o erro que vc irá cair fazendo a correção que eu indiquei?

Vim responder a dúvida mas o Gabriel já deu uma excelente resposta.

Pra complementar a resposta dele, recomendo estudar esse material deste link:

https://msdn.microsoft.com/pt-br/library/bzt2dkta(v=vs.94).aspx

Obrigado pela resposta, Gabriel!

Tudo bem. E com você?

Então mesmo ao errar o chute, o JS considera aquilo que está dentro do if o qual alerta quando eu acerto o chute.

No caso, esse:

            if(input.value == segredos[posicao]) {

                alert("Você acertou!");

                var achou = true;

                break;
            }

E ao ver que tem uma var achou ali dentro, supõe que é dessa variável que estou "falando" no outro if. Desconsiderando assim, aquilo que eu declarei fora da função.

Assim, ele me dá undefined apesar de nem ter entrado no if do acerto.

É isso mesmo? Ou entendi errado?

E quanto ao outro erro ao qual você se referiu, acho que encontrei. Quando var achou = false; está antes da função verifica(), se eu errar o chute, o programa finaliza. E volta a rodar normalmente se clicar novamente no botão. Até aí tudo bem.

O problema é que, se em algum momento eu acertar o chute, e não recarregar a página, o programa estará finalizado assim como antes. E com achou == true. Então ao dar o chute errado e clicar no botão novamente, ele será executado só a partir de verifica(). Portanto, não aparecerá mais o alerta de erro.

Coloquei o console.log(achou); dentro da função para ver se era isso mesmo. E após acertar o chute, achou ficou travada em true.

Certo?

Obrigado pelo texto, Thiago!

Vou estudá-lo sim.

É isso mesmo? Ou entendi errado?

É isso aí, meu aluno! Vc entendeu corretamente!

Certo?

Vc tbm acertou quanto a isso! O problema é exatamente esse que vc descreveu! E a forma de resolver o problema, é justamente fazer a declaração da variável achou logo no início da função verifica().

Portanto, o aprendizado que fica dessa questão é a existência do escopo global e funcional do JavaScript. Além disso, vc aprendeu um pouco mais sobre o funcionamento de declaração de variáveis. E, por fim, também é importante destacar, que o ideal é sempre que possível evitar utilizar variáveis de escopo global!

Qualquer coisa é só falar!

Grande abraço e bons estudos, Anderson!

Beleza! :)))

E obrigado por mais essa dica final.

Abraços!