În JavaScript există 3 moduri de a declara o variabilă și sunt sigur că cei care nu obișnuiesc să scrie cod de JavaScript în mod frecvent, sau nu sunt la curent cu ultimele schimbări ale limbajului, au nelămuriri la vederea (mai) noilor keywords: let și const. Mai ales că var e un keyword întâlnit și prin alte limbaje de programare.

Deci să recapitulăm, spuneam că avem 3 moduri, sau mai precis 3 cuvinte cheie: var (cel mai vechi), let și const.

Pe la începuturile web-ului, în JavaScript exista doar un mod de a declara o variabilă, folosind var , dar avea anumite probleme și limitări.

Problemele lui var

Una din principalele probleme ale lui var este faptul că are function scope.

Acum dacă termenul de “scope” nu-ți este familiar, ei bine “scope” reprezintă disponibilitatea unei variabile sau funcții la a fi folosită.

Asta înseamnă că o variabilă o dată declarată cu var , este disponibilă pentru a fi folosită pe întregul spectru al funcției respective.

În cazul în care variabila nu e declarată în interiorul unei funcții, ea este disponibilă global pentru întreg window , în cazul în care vorbim de client side JavaScript.

În același timp, o variabilă de tip var poate fi redeclarată, astfel codul următor devine cod valid.

var name = "Bogdan";
var age = 19;

if (age > 18) {
  var name = "Alex";
}

console.log(name); //Alex

Da, codul de mai sus se va executa fără nicio eroare și probabil intuiești că situația asta ar putea duce la probleme destul de dificil de detectat și rezolvat într-o bază de cod mai mare.

Un alt aspect e faptul că var este hoisted.

Hoisting-ul e un mecanism din JavaScript care “mută” declararea variabilelor și funcțiilor la începutul scope-ului înainte de execuția codului.

Asta înseamnă că următorul cod:

console.log(name);
var name = "Bogdan";

Este defapt interpretat astfel:

var name;
console.log(name); //undefined
name = "Bogdan";

Avantajele lui let

let rezolvă toate problemele pe care tocmai le-am discutat mai sus.

Contrar lui var ,let este block scoped, în loc de function scoped, astfel că în situația de mai jos, valoarea printată va fi undefined.

function whatsMyName() {
  const age = 19;
  if (age > 18) {
    let name = "Bogdan";
    console.log(name); //Bogdan
  }
  console.log(name); //undefined
}

let poate fi modificat, dar nu poate fi redeclarat. Astfel că următorul cod este invalid:

let name = "Bogdan";
name = "Alex"; //ok

let name = "Alex"; //eroare: name a fost deja declarat

În ceea ce privește hoisting-ul, let este deasemenea hoisted, dar față de var nu este și inițializat. În timp ce var este inițializat ca undefined în momentul în care este hoisted, let e lăsat complet neinițializat, iar accesarea lui înainte de inițializare, adică de atribuirea unei valori, va rezulta într-o eroare.

console.log(firstName); //undefined
console.log(lastName); //eroare

var firstName = "Ion";
let lastName = "Popescu";

Când folosim const

Se folosește pentru reprezentarea constantelor în cod. Prin definiție, o constantă nu își poate schimba niciodată valoarea.

const e extrem de similar, ba chiar putem spune că moștenește toate capabilitățile lui let , poartă în schimb diferența că în momentul declarării trebuie neapărat să-i fie atribuită o valoare și în felul ăsta să fie inițializată. Deasemenea, o dată atribuită o valoare, ea nu mai poate fi schimbată.

const age; //eroare, trebuie inițializată

const age = 20;

age = 30; //eroare, valoarea unei constante nu poate fi schimbată.

În cazul obiectelor, valorile proprietăților pot fi schimbate:

const car = {
  brand: "BMW",
  model: "3 series",
};

car.model = "5 series";

Concluzie

Ca o încheiere, hai să recapitulăm aspectele de mai sus în căteva fraze:

  • Nu mai folosi niciodată var în JavaScript, decât în cazuri foarte specifice, dar fii conștient de problemele pe care le aduce
  • Folosește tot timpul let pentru variabilele a căror referință e nevoie să fie schimbată
  • Folosește tot timpul const pentru toate variabilele a căror valoare va fi constantă