Scope di funzione e scope di blocco
Quando dichiarate una variabile all’interno di una funzione, la variabile è legata all’interno della funzione e non potete accedervi al di fuori della funzione. var
è la parola chiave per definire una variabile per l’accessibilità all’ambito della funzione.
Ora, potreste chiedere, se dà un errore anche se usate let
o const
, perché solo var
è associato all’ambito della funzione? Il fatto è che let
e const
sono usati per definire lo scope di blocco, e prima di ES6, JavaScript non aveva lo scope di blocco o let
e const
.
Lo scope di blocco è l’area dentro
if
,switch
condizioni ofor
ewhile
loop. In parole povere, ogni volta che vedete {curly brackets}, si tratta di un blocco.
Vediamo un esempio:
Ora potreste aspettarvi che nessuno dei comandi di log dovrebbe funzionare ma come potete vedere non è il caso di var, le variabili definite con var dentro if
, switch
condizioni o for
e while
loop possono essere accessibili globalmente e sono parte dello scope globale e quindi è meglio usare let
e const
con loro.
Scopo lessicale
Finalmente, abbiamo raggiunto il vero scopo di questo post. Beh, avrei potuto saltare la lunga discussione sull’ambito, ma personalmente, non credo che si possa capire l’ambito lessicale senza conoscere i componenti chiave che ruotano intorno ad esso.
Ancora una cosa da ricordare: Javascript ha uno scope lessicale con scope di funzioni.
In parole semplici, significa che l’ambito figli ha accesso alle variabili definite nell’ambito padre. Per esempio, se dovessi definire una funzione e dichiarare una variabile al suo interno e all’interno della stessa funzione, definire un’altra funzione, allora dovrei essere in grado di usare quella variabile all’interno della funzione interna a causa dello scoping lessicale. Vediamo un esempio:
Si può vedere dall’esempio, le variabili dichiarate in outerFunction()
sono accessibili da innerfunction()
, questo è scoping lessicale.
Lo scope delle variabili è definito dalla loro posizione nel codice. Per risolvere le variabili, JavaScript inizia dallo scope più interno e cerca verso l’esterno finché non trova la variabile che stava cercando. Nell’esempio precedente, Javascript cerca prima le variabili all’interno di innerFunction()
e quando non le trova, va all’esterno, cioè outerFunction()
Lo scoping lessicale è migliore perché possiamo facilmente capire il valore di una variabile dal codice, mentre nello scoping dinamico, il significato di una variabile può cambiare a runtime, il che lo rende complesso da capire.
Quindi, abbiamo capito con successo cos’è lo scoping lessicale, ora guardiamo le chiusure dove lo scoping lessicale è effettivamente usato.