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

Iniciar Jogo com a função reiniciarJogo()

Ao invés de iniciar o Jogo do Número Secreto declarando as variáveis de:

let numeroSecreto = gerarNumeroAleatorio();
let numeroTentativas = 1;

Eu achei que seria mais fácil já iniciar executando a função reiniciarJogo() visto que nada que ela faz "atrapalha" o início de jogo. Porém, quando eu faço isso, eu tenho o seguinte erro Uncaught ReferenceError: numeroTentativas is not defined at app.js:60:13, o mesmo acontece para o numeroSecreto Queria entender porque isso acontece, visto que eu entendo que quando eu chamo a função reiniciarJogo() eu estou sim definindo o numeroTentativas e numeroSecreto.

Segue código completo para avaliação:

function gerarNumeroAleatorio () {
    return parseInt(Math.random() * 10 + 1);
}

function reiniciarJogo() {
    let numeroSecreto = gerarNumeroAleatorio();
    let numeroTentativas = 1;
    limparCampo();
    document.getElementById('reiniciar').setAttribute('disabled',true);
    exibirTextoNaTela('h1', 'Jogo do número Secreto');
    exibirTextoNaTela('p', 'Escolha um número entre 1 e 10');
}

function exibirTextoNaTela(tag, texto) {
    let campo = document.querySelector(tag);
    campo.innerHTML = texto;
}

function limparCampo() {
    let chute = document.querySelector('input');
    chute.value = '';
}

reiniciarJogo(); 

function verificarChute() {
    let chute = document.querySelector('input').value; 
    if (chute == numeroSecreto) {  
        let textTentativas = numeroTentativas > 1 ? 'tentativas' : 'tentativa';
        exibirTextoNaTela('p',`Acertou! Usando ${numeroTentativas} ${textTentativas} .`);
        document.getElementById('reiniciar').removeAttribute('disabled');
    } else { 
        limparCampo();
        numeroTentativas++;
        if (chute < numeroSecreto) { 
        exibirTextoNaTela('p',`A resposta é maior que ${chute}`);            
    } else {
        if (chute > numeroSecreto) {
        exibirTextoNaTela('p',`A resposta é menor que ${chute}`);    
        }
    }
    
}}
4 respostas
solução!

Olá Mariana!!! Ao fazer isso vc retirou as variáveis numeroSecreto e numeroTentativas do escopo global da aplicação e as colocou no escopo da função reiniciar jogo, portanto elas soh existirão qdo essa função for chamada. Perceba que elas também são necessárias na função verificar chute, mas nao poderão ser acessadas por que soh existem no escopo da função reiniciar jogo.

Essas variáveis tem que ficar nas primeiras linhas do seu código para que estejam no escopo global e existam assim q a página for carregada!

Espero ter ajudado..... Abraços...

Olá Mariana!!! Ao fazer isso vc retirou as variáveis numeroSecreto e numeroTentativas do escopo global da aplicação e as colocou no escopo da função reiniciar jogo, portanto elas soh existirão qdo essa função for chamada. Perceba que elas também são necessárias na função verificar chute, mas nao poderão ser acessadas por que soh existem no escopo da função reiniciar jogo.

Essas variáveis tem que ficar nas primeiras linhas do seu código para que estejam no escopo global e existam assim q a página for carregada!

Espero ter ajudado..... Abraços...

Obrigada, pela reposta Ivo, não tinha ficado claro para mim que havia essa distinção entre variáveis que existem dentro ou fora do escopo das funções.

Nesse caso, fiquei com uma curiosidade: Existe ganho de performance, desempenho, ou algo similar em diminuir o número de variáveis no escopo global e tentar concentrar em manter o máximo possível delas dentro das funções?

Sim, há casos que nem esse que obrigatoriamente precisamos de variáveis globais para usar em outras partes do código e elas sempre ocupa espaço na memória ram, já as de escopo de bloco (quando está dentro do escopo de função, estrutura condicional e etc...) soh ocupam espaço na memória qdo tal bloco é executado. E quanto menos memória usarmos melhor e performance..