1
resposta

localização das variaveis no arquivo.js

Queria entender pq colocando as variaveis fora da função o botão sortear só funciona uma vez.

let quantidade = document.getElementById("quantidade");
let de = document.getElementById("de");
let ate = document.getElementById("ate");
let resultado = document.getElementById("resultado");

function sortear() {
    quantidade = parseInt(quantidade.value);
    de = parseInt(de.value);
    ate = parseInt(ate.value);

    let numerosSorteados = [];
    let numero = obterNumeroAleatorio(de, ate);

    for (i = 0; i < quantidade; i++) {
        numero = obterNumeroAleatorio(de, ate);

        while (numerosSorteados.includes(numero)) {
            numero = obterNumeroAleatorio(de, ate);
        }

        numerosSorteados.push(numero);
    }

    exibirNumerosSorteados(numerosSorteados);
    ativarBotao(btnReiniciar);

    console.log(quantidade);
    console.log(de);
    console.log(ate);
}


function exibirNumerosSorteados(numeros) {
    resultado.innerHTML = `<label class="texto__paragrafo">Números sorteados: ${numeros}</label>`
}

function obterNumeroAleatorio(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function ativarBotao(botao) {
    botao.classList.remove("container__botao-desabilitado");
    botao.classList.add("container__botao");
}

Como vou usar esses mesmo campos em outro na função reiniciar para limpa-los, eu resolvi deixar as variaveis q serão utilizadas de novo no escopo mais alto do arquivo. O problema é que dessa forma, os valores dos campos "quantidade", "de" e "ate" aparentemente só são armazenados uma vez. quando clico no botão de sortear, ela me retorna NãN, como observei no console.log q fiz das variaveis.

1 resposta

Olá!

Existem dois problemas em seu código.

#1 O escopo das variáveis

O comando document.getElementById('quantidade') obtém e retorna o valor do elemento "quantidade".

O escopo "fora" da função só é executado durante o carregamento do programa. As variáveis "quantidade", "de" e "ate" são preenchidas logo ao carregar a página com os valores definidos nos campos respectivos.

Se você modificar os valores no formulário da página, essa mudança não irá refletir nas variáveis do seu programa Javascript. Porque o código que copia o valor dos campos para a variável já foi executado e não há como voltar, a menos que atualize a página (F5).

#2 Reutilização de variáveis

No começo da sua função sortear() você tem o seguinte comando:

quantidade = parseInt(quantidade.value);

Fora da função, você declara uma variável chamada "quantidade" e carrega ela com um objeto. Por isso precisa acessar o valor com {objeto}.value.

Dentro da função, na primeira vez que a executa, você copia para a própria variável um número inteiro parseInt(quantidade.value). Ao fazer isso, o conteúdo da variável "quantidade" deixou de ser um objeto que possúi o atributo "value" e passou a ser um número inteiro.

Então, na segunda vez que tenta executar a função sortear() quando tenta acessar o atributo quantidade.value , ele retorna um "undefined" que a função parseInt() transforma em um NaN (Not a Number).

Espero ter ajudado.