confuso sulla dichiarazione di funzione in {}


18

var a;
if (true) {
  a = 5;

  function a() {}
  a = 0;
  console.log(a)
}
console.log(a)

Ho visto il codice sopra, una funzione è dichiarata in {}. Penso che stamperebbe 0 0, ma stampa 0 5



1
In modalità rigorosa, registra 0 undefined.
CertainPerformance,

@certainPerformance bene, questo è spiegabile, ma non riesco a spiegare che a = 5lascia il blocco. Secondo Bergi nel dupe, function averrà sollevato.
Jonas Wilms,

2
Sembra che la variabile di blocco con ambito locale venga copiata nel blocco esterno quando si raggiunge la dichiarazione di funzione.
Jonas Wilms,

Risposte:


13

Succede quanto segue:

(1) Esistono due dichiarazioni variabili a, una all'interno del blocco e una esterna.

(2) La dichiarazione di funzione viene sollevata e legata alla variabile dei blocchi interni.

(3) a = 5viene raggiunto, che sostituisce la variabile di blocco.

(4) viene raggiunta la dichiarazione di funzione e la variabile di blocco viene copiata nella variabile esterna. Entrambi sono 5 ora.

(5) a = 0viene raggiunto, che sostituisce la variabile di blocco. La variabile esterna non è influenzata da questo.

 var a¹;
 if (true) {
   function a²() {} // hoisted
   a² = 5;
   a¹ = a²; // at the location of the declaration, the variable leaves the block      
   a² = 0;
  console.log(a²)
}
console.log(a¹);

Questo in realtà non fa davvero parte delle specifiche, fa parte della semantica di compatibilità del legacy web , quindi non dichiarare le funzioni all'interno dei blocchi e non fare affidamento su questo codice per comportarsi in questo modo .

Questo è anche spiegato qui


Ma perché una volta raggiunta la dichiarazione di funzione, la variabile di blocco verrà copiata nella variabile esterna? Ha concluso quella dal debugger?
Chor

@Chor no, lo dice la specifica. Non ho idea del perché.
Jonas Wilms,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.