Variabili con lo stesso nome, ma la variabile di ambito locale non viene utilizzata, perché?

Perché la dichiarazione della variabile 'a' non viene utilizzata nell'output del log di console del codice riportto di seguito? Non va contro la catena di portta? La variabile 'a' con il valore non definito sulla row 4 dovrebbe essere sicuramente usata sull'output della console nella row 5?

Voglio capire questo comportmento. Per confermare, questo comportmento non ha niente a che fare con il sollevamento o persino la portta (cioè la catena del field di applicazione)?

Non credo che l'ambito sia rilevante per spiegare questo comportmento poiché 'a' esiste localmente (il suo valore è ' undefined ' in quanto non viene inizializzato) all'interno della function, quindi il motore Javascript non guarderà all'ambiente lessicale esterno per trovare 'a '(che ha un valore di 15 ). Oppure come per la pagina MDN: "L' ambito di una variabile dichiarata con var è il suo context di esecuzione corrente ", che in questo caso è la function di raggruppamento "a" .

Non credo anche che questo comportmento sia il risultato di sollevare per quanto ne so.

Così, inoltre, questo è ciò che viene indicato nella pagina MDN? " Se re-dichiarate una variabile JavaScript, non perderà il suo valore " . ?

  • La domanda fuori discussione, ma, qual è la ragione dietro la dichiarazione di MDN sopra? È semplicemente legato alla gestione della memory? Non c'è motivo logico per assegnare un nuovo indirizzo di memory each volta che viene dichiarata una variabile?

Ora, tornando alla mia domanda:

Dato che sono nuovamente dichiarati, se interpreto MDN correttamente, significa che la linea 3 è fondamentalmente ignorata? Ma non credo proprio perché entrambe le variables vengono dichiarate nei propri contesti di esecuzione separati , quindi sicuramente la variabile 'a' nella row 4 viene utilizzata / acceduta? Poiché la catena di destinazione suggeriva che venisse utilizzata la variabile locale più vicina (cioè il locale 'a' con un valore non definito) e, inoltre, penso che l'espressione MDN si applica solo alle variables nuovamente dichiarate solo lo stesso ambiente lessicale, corretto?

Sto solo cercando di capire se 'a' nella row 4 viene effettivamente utilizzato quando si fa riferimento a 'a' nella row 5? Oppure è ignorata la row 3 e quindi la row 5 accederà invece (vedi) l''a' nella row 3 (cioè il parametro 'a' di checkScope)? – Quest'ultimo tipo implica il primo

Ha senso se la linea 3 del codice precedente viene ignorata semplicemente perché la cancellazione raggiunge lo stesso risultato:

 var a = 15; function checkScope(a) { console.log(a); // log outputs 15 and not undefined } checkScope(a); 

Grazie.

Hai dichiarato una variabile denominata tre volte.

  • Una volta come globale in linea 1: var a = 15;
  • Due volte all'interno della function:
    • Una volta con un'istruzione var sulla row 4: var a;
    • Una volta con una definizione di argomento nella row 3: function checkScope(a) {

La linea 4 var non ha alcun effetto. La variabile è già dichiarata.

Quindi chiamate checkScope(a); che passa il valore globale a (15) all'argomento locale di checkScope . Ecco perché è 15 e non undefined .


Dato che sono nuovamente dichiarati, se interpreto MDN correttamente, significa che la linea 3 è fondamentalmente ignorata?

var a è fondamentalmente ignorato.

Ma non credo proprio perché entrambe le variables vengono dichiarate nei propri contesti di esecuzione separati

Questo è where si sta avventurando con tre e non due dichiarazioni di a . Dichiara la variabile definita dal nome di argomento della function.

Se redeclare una variabile JavaScript, non perderà il suo valore.

dare un'occhiata a questa risposta .

 var a = 15; function checkScope(a) { var a; // this is equivalent to redeclaring the variable console.log(a); // log outputs 15 and not undefined } checkScope(a); 

Fondamentalmente la linea 4

 var a; 

è where il compilatore trova una variabile redeclared del parametro di function. A causa dell'initialization mancante, a mantiene il valore del valore di consegna del parametro a .