Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

¿Por qué si declaro una variable dentro de una función mi código cambia si lo declaro fuera de una función?

Mejoré el juego de las adivinanzas con lo aprendido en la clase, lo que hice fue ponerle un input y un botón y que solo le de al usuario 3 intentos para poder adivinarlo. Tardé muchas horas averiguando porqué no me corría, porque siempre que entraba y le apretaba un botón, me salía que me quedaban 3 intentos y nunca bajaba de ahí, hasta que al final la solución era que mi variable "intentos" la declaré fuera de la función y si me corrió bien, ya me dejaba ejecutar con normalidad el código. Les dejo mi solución con comentarios de lo que le moví, a continuación dejo el código que no me corría:

<meta charset="UTF-8">

<h1>PROGRAMA - JUEGO ADIVINANZA</h1>
<h4>Ingresa un número entre 0 y 10</h4>

<input />
<button>Aceptar</button>

<script>

    function saltarLinea() {

        document.write("<br>");
        document.write("<br>");
        document.write("<br>");

    }

    function imprimir(frase) {

        document.write(frase);
        saltarLinea();

    }

    function sacarNumero(n) {
        return Math.round(Math.random() * n);
    }


    function verificar() {
        //Esta función fue la que saqué de la función y la declaré afuera
        var intentos = 3;

        while(intentos >= 1) {

            if (input.value == numeroAleatorio) {

                imprimir("Felicidades, lo has conseguido, el número correcto era: " + numeroAleatorio);
                break;

            } else {
                intentos--;
                alert("Has fallado, intentalo de nuevo - Intentos restantes: " + intentos);
                input.focus();
                break;

            }

        }

        if(intentos == 0){
            imprimir("Has superado el límite máximo de intentos. El número era: " + numeroAleatorio);
        }

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

    }


    var numeroMaximo = 10;

    var numeroAleatorio = sacarNumero(numeroMaximo);

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

    input.focus();

    button.onclick = verificar;

</script>

Y esta fue mi solución moviendo la variable:

<meta charset="UTF-8">

<h1>PROGRAMA - JUEGO ADIVINANZA</h1>
<h4>Ingresa un número entre 0 y 10</h4>

<input />
<button>Aceptar</button>

<script>

    function saltarLinea() {

        document.write("<br>");
        document.write("<br>");
        document.write("<br>");

    }

    function imprimir(frase) {

        document.write(frase);
        saltarLinea();

    }

    function sacarNumero(n) {
        return Math.round(Math.random() * n);
    }


    function verificar() {

        while(intentos >= 1) {

            if (input.value == numeroAleatorio) {

                imprimir("Felicidades, lo has conseguido, el número correcto era: " + numeroAleatorio);
                break;

            } else {
                intentos--;
                alert("Has fallado, intentalo de nuevo - Intentos restantes: " + intentos);
                input.focus();
                break;

            }

        }

        if(intentos == 0){
            imprimir("Has superado el límite máximo de intentos. El número era: " + numeroAleatorio);
        }

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

    }
    //Aquí fue donde moví la variable y al final el ciclo while si me dejí
    var intentos = 3;
    var numeroMaximo = 10;

    var numeroAleatorio = sacarNumero(numeroMaximo);

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

    input.focus();

    button.onclick = verificar;

</script>

¿Por qué pasó esto? No logro comprender por más que le doy vueltas a la cabeza

2 respuestas

Al declarar tu variable dentro de la función cada vez que hacías clic se reiniciaba la cuenta. Aquí: button.onclick = verificar; llamas a la función, lo que pasaba en tu primer código es que por cada clic se volvía a definir var intentos = 3;, por lo que por más que hicieras clic, no iba a cambiar. En el segundo código intentos se define al lanzar la página, así que se asigna el valor de 3 solo una vez. Espero no haberte revuelto más.(:

Excelente.....!!!