Specyfikatory zasięgu - const, let
ES6 wprowadza dwa nowe typy zmiennych - const
oraz let
. Oba są widoczne jedynie w zasięgu lokalnym, w którym zostały zdefiniowane i powinny być używane zamiast dotychczasowego var
. Zmiennych tego typu nie można też ponownie deklarować.
const
używamy wszędzie tam, gdzie przypisanie do zmiennej nie będzie ulegać zmianie. Użycie tego typu nie oznacza że nie ma możliwości mutowania danych - jeżeli do zmiennej przypiszemy obiekt, wciąż możemy (lecz nie powinniśmy!) modyfikować jego wartości.
Jeżeli chcemy by nasz obiekt był całkowicie nie mutowalny, możemy użyć Object.freeze
const a = 42;
a = 43; // błąd - nie można zmienić przypisania
const b = { theAnswerToLifeTheUniverseAndEverything: undefined }
b.theAnswerToLifeTheUniverseAndEverything = 42; // poprawnie
const c = { theAnswerToLifeTheUniverseAndEverything: undefined };
Object.freeze(c);
c.theAnswerToLifeTheUniverseAndEverything = 42; // błąd
const d = [];
d.push(42); // poprawnie
let
jest podobny w działaniu do var
dostępny jest on jednak tylko w zasięgu, w którym został zadeklarowany.
Dodatkową różnicą jest to, że w przypadku stosowania closure wartości zmiennej będą kopiowane, a nie przekazywane przez referencję.
if(true) {
var a = 42;
let b = 42;
}
console.log(a); // 42;
console.log(b); // błąd - b nie jest zdefiniowane
// wyświetli dwa razy "2"
for(var i = 0 ; i < 2 ; i++) {
setTimeout(function() { console.log(i) });
}
// wyświetli "0" i "1"
for(let i = 0 ; i < 2 ; i++) {
setTimeout(function() { console.log(i) });
}