let e’ disponibile solo a partire dalla specifica ECMA6
—–
var e let sono due parole chiave utilizzate per la dichiarazione di variabili
var miaVar=5;
let miaLet=7;
—–
la principale differenza e’ lo scope in cui sono valide. Le variabili dichiarate con let sono valida solo all’interno del block scope, o scope di blocco(ovvero il codice all’interno di { } in cui sono scritte).
—–
a livello di global scope, o scope globale, agiscono nello stesso modo.
—–
a livello di function scope, o scope della funzione, agiscono nello stesso modo.
—–
tuttavia in caso di ridichiarazioni (in scope diversi) hanno un comportamento differente:
var myVar=5;
{
myVar=6;
}
console.log(myVar):// vale 6let myLet=5;
{
let myLet=6;
}
console.log(myLet):// vale 5
—–
Inoltre, ridichiarare una var con un altro var non da’ problemi, a prescindere dello scope in cui si fa la ridichiarazione:
var myVar=5;
var myVar=6;
{
var myVar=7;
}
var myVar=8;
//abbiamo sempre agito sulla stessa myVar
—–
ridichiarare un let con un altro let, ma in scope e sub-scope differenti, non da’ errore:
let a=3;
{
….let a=4:
}
{
…. let a=5:
…. {
…. …. let a=6:
…. }
}
—–
ridichiarare un let con un altro let, ma nello stesso scope, da’ errore:
let a=3;
let a=4; //errore
—–
ridichiarare un var con un let, o il contrario, non e’ consentito:
var a=3;
let a=4; //errore
let b=3;
var b=4; //errore
—–
anche un for possiede un block scope per cui usare una var o una let come indice presenta sottili differenze:
for( var myVar=1, myVar<5; myVar++){
//….
}
console.log(myVar); //vale 4
(mentre invece)
for( let myLet=1, myLet<5; myLet++){
//….
}
console.log(myLet); //vale undefined
—–
una variabile dichiarata con var appartiene all’oggetto window e puo’ quindi essere richiamata sia come:
myVar…
window.myVar…
window[myVar]…
la stessa cosa NON puo’ essere fatta con le variabili let, in quanto NON appartiene all’oggetto window.
—–
con le dichiarazioni var abbiamo la comodita’, utile in certi casi, di poter usare una stringa come identificatore per una variabile, ad esempio:var cippa=2;
let lippa=3;
myFun(cippa, lippa);
function myFun(nomevar, nomelet){
console.log(nomevar)://stampa il nome della var
console.log(window[nomevar]); //stampa il valore della var
console.og(window.nomevar);//stampa il valore della var (metodo alternativ.)console.log(nomelet)://stampa il nome della let
console.log(window[nomelet]); //errore
console.og(window.nomelet);//errore
}
—–
assegnare un valore ad una variabile non dichiarata equivale implicitamente ad una dichiarazione di una variabile var globale a prescindere dalla sua posizione (anche da dentro una funzione):
—–
HOISTING – ovvero la possibilita’ di usare una var prima di essere consentita.
Le variabili, anche se effettivamente dichiarate verso la fine del codice vengono comunque processate prima di tutto il resto, per cui:
myVar=”pippo”;
console.log(myVar); //stampa pippo
var myVar;Con let l’hoisting NON e’ consentito (referenceError) in quanto non vengono inizializzate come undefined [???][questo poi e’ da verificare].
—–
A livello teorico let e const potrebbero sostituire completamente l’uso di var.
(anche se non sempre la cosa risulterebbe comoda)
—–