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

Dúvida - ARRAY

Bom dia, tenho uma dúvida no último exercicio.

<meta charset="UTF-8">

<input/>
<button>Compare com o meu segredo</button>

<script>

    function sorteia() {

        return Math.round(Math.random() * 10);
    }

    function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while(numero <= quantidade) {

            var numeroAleatorio = sorteia();

            if(numeroAleatorio !== 0 ) {

                var achou = false;

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

                    if(segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }

                if(achou == false) {
                    segredos.push(numeroAleatorio);    
                    numero++;
                } 
            }
        }

        return segredos;
    }

    var segredos = sorteiaNumeros(5);

    console.log(segredos);

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

    function verifica() {

        var achou = false;

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

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

                alert("Você ACERTOU!");
                achou = true;
                break;
            }
        }

        if(achou == false) {

            alert("Você ERROU!");    
        }


        input.value = "";
        input.focus();        
    }

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

    button.onclick = verifica;


</script>

Este é o código do exercício. Minha dúvida é a seguinte: como eu posso manter o ARRAY neste linha de código??

function verifica() {

        var achou = false;

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

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

                alert("Você ACERTOU!");
                achou = true;
                break;
            }
        }

        if(achou == false) {

            alert("Você ERROU!");    
        }


        input.value = "";
        input.focus();        
    }

Se ele foi parar lá em cima, e está encerrado na função sorteiaNumero()????

function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

        while(numero <= quantidade) {

            var numeroAleatorio = sorteia();

            if(numeroAleatorio !== 0 ) {

                var achou = false;

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

                    if(segredos[posicao] == numeroAleatorio) {
                        achou = true;
                        break;
                    }
                }

                if(achou == false) {
                    segredos.push(numeroAleatorio);    
                    numero++;
                } 
            }
        }

        return segredos;
    }

Este ARRAY não faria parte exclusiva de toda aquela função??? Ou só pelo fato de eu chamar ela, a função, aqui

var segredos = sorteiaNumeros(5);

    console.log(segredos);

eu já tenho o direito de trabalhar com ARRAY??? Não sei se ficou confusa a questão.

7 respostas

Deixa eu ver se entendi, se não for isso você grita!

Vou dar um exemplo menor para ver se é isso que você esta com dúvida:

var nome = "Flávio";

function exibeNome() {
     alert(nome);
}

function exibeNome2() {
    alert(nome);
}

exibeNome(); // funciona
exibeNome2(); // funciona

Temos uma variável nome que foi declarada fora das funções exibeNome e exibeNome2, no entanto, essas funções conseguem acessar essa variável. Se for isso, vou explicar.

Variáveis declaradas com var fora de uma função são acessíveis dentro de qualquer função, é algo que podemos chamar de um escopo global.

é por isso que o array que foi declarada no código é acessível nas demais funções. Agora, veja um caso onde há escopo:

function teste() {
    var nome = "calopsita";
    alert(nome);
}

teste(); // exibe o alerta
alert(nome); // não funciona

Nesse segundo casos, como a variável nome foi declarada dentro de uma função com var, ela só existe no momento em que a função é chamada, ela não é acessível globalmente.

Se não era essa a sua dúvida, foi até legal para rever alguns conceitos.

No aguardo meu aluno.

Ah, isso aqui também funciona:

function exibeNome() {
     alert(nome);
}

function exibeNome2() {
    alert(nome);
}
var nome = "Flávio"; // declarei a variável depois das funções
exibeNome(); // funciona
exibeNome2(); // funciona

Funciona porque as funções quando são declaradas com functionnão são executadas. Dai no momento que são chamadas a variável nome já terá sido declarada e por isso estará disponível.

Aguardo seu retorno!

Acho que minha dúvida não ficou clara. Ou eu que não estou entendendo. Para mim, na minha cabeça, não entendo como a variável "segredos = []", que foi declarada na função "sorteiaNumeros(quantidade), é acessada pela função "verifica()", mais a baixo. São duas funções distintas e fechadas, porém a "verifica()", que está declarada depois da função "sorteiaNumeros(quantidade), pega ou se utiliza do ARRAY de uma variável de uma função acima.

O ARRAY da variável "segredos = []" está aqui, na função "sorteiaNumeros(quantidade)"

function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;

Porém, mais a baixo, a função "verfica()", se utiliza de uma ARRAY não declarado, ou não dado, dentro desta mesma função.

function verifica() {

        var achou = false;

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

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

                alert("Você ACERTOU!");
                achou = true;
                break;

E essa variável " segredos" foi declarada mais acima, como recebendo a função "sorteiaNumeros(quantidade)".

var segredos = sorteiaNumeros(5);

    console.log(segredos);

Será que me expressei melhor?? Como e porque o ARRAY está nesta linha da função verifica??? Sendo que somente vejo uma ARRAY acima, declarado na variável da função "sorteiaNumeros(quantidade)"

function verifica() {

        var achou = false;

        for(var posicao = 0; posicao < segredos.length; posicao++) {
            if(input.value == segredos[posicao])
function sorteiaNumeros(quantidade) {

        var segredos = [];

        var numero = 1;
solução!

Por causa dessa linha:

   var segredos = sorteiaNumeros(5);

Quando você capturou o retorno de sorteiaNumeros, declarou uma variável de mesmo nome, só que fora da função. Dai, como ela não pertence a nenhuma função, é acessível globalmente.

Consegui ajudar?

Acho que sim Flávio, parece que é o que eu estava imaginando. Como a " var segredos" recebe a função "sorteiaNumeros(5)", ela, "segredos," consequentemente trás o array dentro de si, certo?? Por isso eu posso trabalhar com array dentro da função "verifica()". É isso??? É como se o array estivesse embutido e isso me permite explorar-lo e manipula-lo dentro de outras funções ou ações. É isso??

Isso mesmo! Com o tempo, depois que superar essa parte da lógica e avançar ainda mais na linguagem JavaScript, você verá que há outras formas de organizar o código, mais avançadas que ajudam a entender melhor o fluxo do seu código. Não as apresentei neste curso porque o foco é lógica de programação e procurei usar a menor carga possível da linguagem JavScript para tornar o treinamento mais acessível a todos.

Sucesso e bom estudo, meu aluno!!!

Obrigado Flávio, ajudou bastante. Devagar eu vou pegando, acho que esse inicio é bem teoria, exercício de raciocínio básico de lógica né. Bom saber que existem ferramentas, dentro das diferentes linguagens, que nos ajudam nessas partes mais intricadas. Parabéns pelos vídeos, está bem didático.