Scope di una variabile

di il
12 risposte

Scope di una variabile

Ciao a tutti, avrei una domanda sullo scope delle variabili:

così non va
var AltraVariabile = document.getElementById('mio-ID');
var miaVariabile = 100 - AltraVariabile.value;

function miaFunzione(){
        if(miaVariabile < 30)
        	...
}
così va
var AltraVariabile = document.getElementById('mio-ID');

function miaFunzione(){
	var miaVariabile = 100 - AltraVariabile.value;
        if(miaVariabile < 30)
        	...
}
Perchè la variabile non viene vista se è all'interno dell'if?
Non dovrebbe essere vista ovunque?

Grazie!

12 Risposte

  • Re: Scope di una variabile

    La variabile viene vista :
    
    <html>
    <script>
    var AltraVariabile = 90;
    var miaVariabile = 100 - AltraVariabile;
    
    function miaFunzione(){
            alert("quaqua");
    
            if(miaVariabile==10) {
                alert("cucu");
            } else {
                alert("perepe");
            }       
    }
    </script>
    <body>
       <button onclick="miaFunzione()">Click me</button>
    </body>
    </html
    
    dal tuo esempio non è una variabile booleana ...
  • Re: Scope di una variabile

    C'entra nulla che venga usato il "getElementById"?
    Perchè a me non funziona...
  • Re: Scope di una variabile

    Il tuo codice passa una valore numerico ad un if ,l'if non può in questo caso assegnare un valore true o false all'espressione valutata ..... , la tua è una variabile numerica,tanto per capire meglio stampa il valore della variabile AltraVariabile così vedi cosa contiene
  • Re: Scope di una variabile

    Ti ringrazio, provo subito!

    Edit: ho modificato il messaggio iniziale; quello è quanto accade.
    Sapreste dirmi il perchè?
    Grazie!
  • Re: Scope di una variabile

    parseInt() ha scritto:


    Perchè la variabile non viene vista se è all'interno dell'if?
    Non dovrebbe essere vista ovunque?
    Sì, la variabile dovrebbe essere visibile ovunque, ma giusto per precauzione... dove stai eseguendo questo codice?
    Direttamente in un browser?

    Non è che è presente anche altrove una dichiarazione simile?
    Attenzione al concetto di "Global Scope" e "Hoisting" (cerca i termini su Google).

    Ciao!
  • Re: Scope di una variabile

    Sì, in un browser: file html, css e js separati.
    Ho dichiarazioni simili, ma tutte diverse. Cioè ho delle variabili associate a degli id, ma tutte diverse fra loro.
  • Re: Scope di una variabile

    parseInt() ha scritto:


    Sì, in un browser: file html, css e js separati.
    Ho dichiarazioni simili, ma tutte diverse. Cioè ho delle variabili associate a degli id, ma tutte diverse fra loro.
    Allora credo sia una buona idea riportare tutto il codice, oppure creare un prototipo più semplice da proporre che riproduca il problema.
    In caso contrario, solo la VM di JavaScript sa cosa sta succedendo da quelle parti...
  • Re: Scope di una variabile

    Ecco il codice completo (è un semplice esercizio, nulla di chè):

    HTML
    <!DOCTYPE html>
    <html lang="it">
        <head>
            <link rel="stylesheet" href="condizione-if.css">
        </head>
        <body>
            <div id="xxx">
                <h2>Inserisci il tuo anno di nascita</h2>
                <p id="controllo">Devi avere almeno 14 anni</p>
                <input type="text" id="data-nascita">
                <div id="messaggio-non-puoi">
                    <h3>Non puoi entrare!</h3>
                </div>
                <div id="messaggio-puoi">
                    <h3>Puoi accedere al sito!</h3>
                </div>
            </div>
            <script src="condizione-if.js"></script>
        </body>
    </html>
    CSS
    #xxx{
        display: flex;
        flex-direction: column;
        width: 400px;
        margin: 0 auto;
    }
    h2, p{
        text-align: center;
    }
    #controllo{
        display: none;
    }
    input{
        text-align: center;
    }
    input:focus{
        border-color: aqua;
    }
    h3{
        text-align: center;
    }
    #messaggio-non-puoi, #messaggio-puoi{
        width: 200px;
        color: red;
        height: 30px;
        padding: 1rem;
        margin: 0 auto;
        display: none;
    }
    #messaggio-puoi{
        color: green;
    }
    JS
    var controlloEta = document.getElementById('controllo');
    var dataDiNascita = document.getElementById('data-nascita');
    var messaggioNo = document.getElementById('messaggio-non-puoi');
    var messaggioSi = document.getElementById('messaggio-puoi');
    
               /* var calcoloEta = 2020 - dataDiNascita.value;        se la definisco qui non viene vista nella funzione "mostraMessaggio" */
    
    function mostraDivieto(){
        controlloEta.style.display = 'block';
    }
    dataDiNascita.addEventListener('focus', mostraDivieto, false);
    function mostraMessaggio(){
    
        var calcoloEta = 2020 - dataDiNascita.value;              /* devo scriverla qui dentro altrimenti non posso usare la condizione nell'IF */
    
        if(calcoloEta < 14){
            messaggioNo.style.display = 'block';
            messaggioSi.style.display = 'none';
        }
        else{
            messaggioSi.style.display = 'block';
            messaggioNo.style.display = 'none';
        }
    }
    dataDiNascita.addEventListener('blur', mostraMessaggio, false);
  • Re: Scope di una variabile

    Quando scrivi "se la definisco qui non viene vista nella funzione...", cosa intendi tu per "venire vista"?
    Come testi se la variabile è visibile?
  • Re: Scope di una variabile

    Provando i file sul browser vedo se funziona...
    Se scrivo la variabile dove ho commentato che funziona, allora va tutto come dovrebbe (la scrivo lì e non la scrivo piu sopra); se scrivo la variabile dove ho commentato che non va (e solo lì) allora non va più niente.
    Come appunto se non la vedesse.
  • Re: Scope di una variabile

    parseInt() ha scritto:


    Se scrivo la variabile dove ho commentato che funziona, allora va tutto come dovrebbe (la scrivo lì e non la scrivo piu sopra); se scrivo la variabile dove ho commentato che non va (e solo lì) allora non va più niente.
    Cosa vuol dire "non va più niente"? Se parli della logica generale, probabilmente la causa è dovuta al fatto che quell'if() che si basa sul valore della variabile fallisce, ma non perché la variabile non esista o sia dichiarata altrove, ma perché tu nella dichiarazione fai anche l'assegnamento del valore!

    Se tu dichiari la variabile nella funzione e contestualmente gli assegni il valore, in quel caso tutto va per il verso giusto perché hai agganciato quella funzione all'evento blur() della casella che contiene il valore che usi per la variabile. Se invece assegni il valore all'esterno, questo sarà sicuramente errato perché ancora non hai scritto nulla nella casella.

    Il problema non riguarda il punto in cui dichiari la variabile, bensì il contesto in cui le assegni il valore, e dato che questo dipende dal contenuto di un controllo di input presente nella pagina, se lo fai all'inizializzazione della stessa il valore non potrà mai essere corretto.

    Ma questo problema non ha nulla a che vedere con bug del browser o di JavaScript, problemi con la visibilità delle variabili e quant'altro: hai commesso un errore di logica di programmazione.

    Non c'è una condizione in cui il programma "va" oppure "non va": il programma va sempre ed esegue quello che tu gli dici di fare, solo che hai sbagliato a dirgli cosa fare e/o in che tempi.

    Ciao!
  • Re: Scope di una variabile

    Grazie dell'aiuto!
Devi accedere o registrarti per scrivere nel forum
12 risposte