# Zakresy (Scopes)
# Dostępność zmiennych
Tworząc zmienne chcemy mieć do niej dostęp z pewnego kawałka naszego kodu.
W języku JavaScript za tę dostępność odpowiadają zakresy (scopes).
Zmienne są dostępne wszędzie w zakresie (które są tworzone przez funkcje i bloki kodu), w którym zostały zdefiniowane
i nieosiągalne spoza niego:
function foo() {
let count = 0;
console.log(count); // => 0
}
foo();
console.log(count); // => ReferenceError: count is not defined
2
3
4
5
6
7
W tym miejscu warto wspomnieć o różnicy między var a let. Zmienne definiowane przy pomocy let
są dostępne w obrębie bloku kodu a te przy użyciu var w obrębie funkcji:
function foo(){
{
var varX = 2;
let letX = 3;
console.log(varX); // => 2
console.log(letX); // => 3
}
console.log(varX); // => 2
console.log(letX); // => ReferenceError: letX is not defined
}
foo();
2
3
4
5
6
7
8
9
10
11
12
13
# Zagnieżdżenia
Idąc dalej stwórzmy zakres w zakresie.
function outerFunc() {
let outerVar = 'I am outside!';
function innerFunc() {
console.log(outerVar); // => "I am outside!"
let innerVar = 'I am inside';
}
console.log(innerVar) // => ReferenceError: innerVar is not defined
innerFunc();
}
outerFunc();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Jak widzimy z wewnętrzenego zakresu tworzonego przez innerFunc mamy dostęp do zmiennych
stworzonych w outerFunc lecz nie działa to w drugą stronę.
# Leksykalny zakres (lexical scope)
Najprościej rzecz ujmując leksykalny zakres funkcji wewnętrznej to zakres zdefiniowany przez
zewnętrzne dla niej funkcje.