Scope di una variabile

di Anonimizzato28650 il
12 risposte
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

  • 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 ...
  • C'entra nulla che venga usato il "getElementById"?
    Perchè a me non funziona...
  • 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
  • Ti ringrazio, provo subito!

    Edit: ho modificato il messaggio iniziale; quello è quanto accade.
    Sapreste dirmi il perchè?
    Grazie!
  • 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!
  • 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.
  • 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...
  • 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);
  • Quando scrivi "se la definisco qui non viene vista nella funzione...", cosa intendi tu per "venire vista"?
    Come testi se la variabile è visibile?
  • 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.
  • 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!
  • Grazie dell'aiuto!
Devi accedere o registrarti per scrivere nel forum
12 risposte