# 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
1
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();
1
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();

1
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.